十四 製作http伺服器端

2021-08-20 09:22:41 字數 2150 閱讀 6561

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

#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)

error_handling("bind() error");

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

error_handling("listen() error");

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) //是否為get請求

fclose(clnt_read);

send_data(clnt_write, ct, file_name); //響應給客服端

return null;

}//服務端響應訊息

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

/*傳輸頭資訊*/

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)

//傳送客服端錯誤處理

void send_error(file *fp)

//控制台錯誤列印

void error_handling(char *message)

開啟瀏覽器,位址列輸入服務端的ip,埠,請求的檔名資訊訪問伺服器:測試:index.html:在本地用記事本自己隨便寫點東西儲存為html格式即可)

24 實現http伺服器端

1.http hypertext transfer protocol超文字傳輸協議。超文字是可以根據客戶端請求而跳轉的結構化資訊。http協議是以超文字傳輸為目的而設計的應用層協議,是基於tcp ip實現的協議,實現該協議就相當於實現了web伺服器端。2.http協議又稱為無狀態的stateless...

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...