24 實現http伺服器端

2021-07-26 17:25:03 字數 2765 閱讀 2027

1.http:hypertext transfer protocol超文字傳輸協議。超文字是可以根據客戶端請求而跳轉的結構化資訊。

http協議是以超文字傳輸為目的而設計的應用層協議,是基於tcp/ip實現的協議,實現該協議就相當於實現了web伺服器端。

2.http協議又稱為無狀態的stateless協議

從下圖中可以看出伺服器端響應客戶端請求後立即斷開,不會維持連線狀態。即使同乙個客戶端再次傳送請求,伺服器端也無法辨認,而是以同等方式對待。

為了彌補http無法保持連線的缺點,web程式設計中通常會使用cookie和session。

3.請求訊息的結構

客戶端向伺服器端傳送的請求:請求行、訊息頭、訊息體。

請求行包含請求方式,get或post,請求行只能一行傳送。圖中含義請求get index.html檔案,希望以1.1版本的http協議進行通訊。

訊息頭:傳送請求的瀏覽器資訊,使用者認證資訊等http附加資訊。

訊息體:需要以post方式傳送請求。

以空行分開。

4.相應訊息的結構

伺服器端向客戶端傳遞的響應訊息:狀態行、訊息頭、訊息體

狀態行:客戶端請求的處理結果,圖中的含義,http 1.1版本相應,你的請求已正確處理200 ok。

訊息頭:資料型別、長度等。圖中,伺服器名******webserver,資料型別text/html,資料長度不超過2048.

5. 基於linux的多執行緒web伺服器端

webserv_linux.c

#include #include #include #include #include #include #include #define buf_size	1024

#define small_buf 100

void * request_handler(void * arg);

void send_data(file * fp, char * ct, char * file_name);

char * content_type(char * file);

void send_error(file * fp);

void error_handling(char * message);

int main(int argc, char * argv)

serv_sock = socket(pf_inet,sock_stream,0);

memset(&serv_adr, 0, sizeof(serv_adr));

serv_adr.sin_family = af_inet;

serv_adr.sin_addr.s_addr = htonl(inaddr_any);

serv_adr.sin_port = htons(atoi(argv[1]));

if(bind(serv_sock,(struct sockaddr *)&serv_adr,sizeof(serv_adr)) == -1)

if(listen(serv_sock,20) == -1)

while(1)

close(serv_sock);

return 0;

}void * request_handler(void * arg)

strcpy(method,strtok(req_line," /"));

strcpy(file_name,strtok(null," /"));

strcpy(ct,content_type(file_name));

if(strcmp(method,"get") != 0)

fclose(clnt_read);

send_data(clnt_write,ct,file_name);

}void send_data(file *fp,char *ct,char *file_name)

//send head

fputs(protocol,fp);

fputs(server,fp);

fputs(cnt_len,fp);

fputs(cnt_type,fp);

while(fgets(buf,buf_size,send_file) != null)

fflush(fp);

fclose(fp);

}char * content_type(char *file)else

}void send_error(file * fp)

void error_handling(char * message)

執行結果:

十四 製作http伺服器端

這裡web服務端是用的多執行緒併發方式,而沒有使用iocp或epoll模型,因為客服端和服務端交換1次資料後就立即斷開連線,沒有足夠時間發揮ipcp或epoll的優勢。在服務端和客服端保持較長連線的前提下頻繁傳送大小不一的訊息時 最典型的就是網遊伺服器 才能真正發揮出這2種模型的優勢。include...

socket伺服器端

伺服器 include winsock2.h include string.h include stdio.h include time.h include stdarg.h include stdlib.h pragma comment lib,ws2 32 void errexit const ...

kerberos伺服器端

1.安裝tcl wget tar zvxf tcl8.5.12 src.tar.gz cd tcl8.5.12 cd unix configure make make install 3.解壓 tar xvf krb5 1.10.3 signed.tar tar zvxf krb5 1.10.3.t...