標籤:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#include <arpa/inet.h>#include <sys/socket.h>#define PORT 8080 // 伺服器監聽連接埠void errorHandling(char *message); // 錯誤處理int main(int argc, char *argv[]){ int serv_sock; // 儲存後面建立的伺服器通訊端 int clnt_sock; // 儲存接受請求的用戶端通訊端 char buf[1024]; // 緩衝區 struct sockaddr_in serv_addr; // 儲存伺服器通訊端地址資訊 struct sockaddr_in clnt_addr; // 儲存用戶端通訊端地址資訊 socklen_t clnt_addr_size; // 用戶端通訊端地址變數的大小 // 發送給用戶端的固定內容 char status[] = "HTTP/1.0 200 OK\r\n"; char header[] = "Server: A Simple Web Server\r\nContent-Type: text/html\r\n\r\n"; char body[] = "<html><head><title>A Simple Web Server</title></head><body><h2>Welcome!</h2><p>This is shiyanlou!</p></body></html>"; // 建立一個伺服器通訊端 serv_sock = socket(PF_INET, SOCK_STREAM, 0); if(-1 == serv_sock){ errorHandling("socket() error"); } // 配置通訊端IP和連接埠資訊 memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); serv_addr.sin_port = htons(PORT); // 綁定伺服器通訊端 if(-1 == bind(serv_sock, (struct sockaddr*)&serv_addr, sizeof(serv_addr))){ errorHandling("bind() error"); } // 監聽伺服器通訊端 if(-1 == listen(serv_sock, 5)){ errorHandling("listen() error"); } // 接受用戶端的請求 clnt_addr_size = sizeof(clnt_addr); clnt_sock = accept(serv_sock, (struct sockaddr *) &clnt_addr, &clnt_addr_size); if(-1 == clnt_sock){ errorHandling("accept() error"); } // 讀取用戶端請求 read(clnt_sock, buf, sizeof(buf) -1); printf("%s", buf); // 向用戶端通訊端發送資訊 write(clnt_sock, status, sizeof(status)); write(clnt_sock, header, sizeof(header)); write(clnt_sock, body, sizeof(body)); // 關閉通訊端 close(clnt_sock); close(serv_sock); return 0;}void errorHandling(char *message){ fputs(message, stderr); fputc(‘\n‘, stderr); exit(1);}
【轉】c語言實現HTTP SERVER