實現簡單的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...