TCP IP網路程式設計2 簡單的Web伺服器

2021-07-11 10:32:14 字數 2579 閱讀 4660

實現簡單的web伺服器有三種處理請求的方式:

多程序、多執行緒和i/o復用

下面利用多執行緒處理連線的請求,每個連線新增乙個執行緒來處理

返回靜態檔案,不存在則返回400

#include 

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

long get_filesize(char *path);

int main(int argc, char *argv)

serv_sock = socket(pf_inet, sock_stream, 0);

if(serv_sock == -1)

error_handling("socket() error");

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, 20) == -1)

error_handling("listen() error");

while(1)

close(serv_sock);

return0;}

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)

; char cnt_type[small_buf];

char buf[buf_size];

file *send_file;

sprintf(cnt_type, "content-type:%s\r\n\r\n", ct);

send_file = fopen(file_name, "r");

if(send_file == null)

sprintf(cnt_len, "content-length:%ld\r\n", get_filesize(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)

; char cnt_type = "content-type:text/html\r\n\r\n";

char content = ""

"error occurred, please check the file name!""";

sprintf(cnt_len, "content-length:%d\r\n", sizeof(content));

fputs(protocol, fp);

fputs(server, fp);

fputs(cnt_len, fp);

fputs(cnt_type, fp);

fputs(content, fp);

fflush(fp);

fclose(fp);

}void error_handling(char *message)

long get_filesize(char *path)

TCP IP網路程式設計

tcp ip 是供已連線網際網路的計算機進行通訊的通訊協議。tcp ip 定義了裝置 並非只有計算機 如何連入網際網路,以及資料如何在它們之間傳輸的標準。ip internet protocol 網際網路協議。從這個名稱我們就可以知道ip協議的重要性。在現實生活中,我們進行貨物運輸時都是把貨物包裝成...

TCP IP網路程式設計

套接字 傳輸網路資料的軟體裝置。tcp的特點 可靠的 按序傳遞的 基於位元組的面向連線的資料傳輸方的協議。傳輸過程中資料不會消失,按序傳輸資料,傳輸的資料不存在資料邊界。udp的特點 不可靠的 無序的 以資料高速傳輸為目的的協議。強調快速傳輸而非傳輸順序,傳輸的資料可能丟失也可能損壞,傳輸的資料有資...

網路程式設計學習 tcp ip程式設計

tcp 不記錄訊息邊界 udp 記錄訊息邊界 用到的結構體 struct sockaddr un 例子 struct sockaddr un serveraddr serveraddr.sun family af unix server socket strcpy serveraddr.sun pa...