C/C++ 實現簡易HTTP伺服器的示例
阿新 • • 發佈:2020-10-19
#include <stdio.h> #include <stdlib.h> #include <process.h> #include <WinSock2.h> #pragma comment(lib,"ws2_32.lib") #define BUF_SIZE 2048 #define BUF_SMALL 100 void Send_404(SOCKET sock) { char Protocol[] = "HTTP/1.0 404 Bad Request\r\n"; send(sock,Protocol,strlen(Protocol),0); closesocket(sock); } void SendData(SOCKET sock,char *filename) { char Protocol[] = "HTTP/1.1 200 OK\r\n"; char ServerType[] = "Server:MyWebServer\r\n"; char ContentLen[] = "Content-length:2048\r\n"; char ContentType[] = "Content-type:text/html\r\n"; char buffer[BUF_SIZE] = {0}; FILE *fp; if ((fp = fopen(filename,"r")) != NULL) { // 傳輸頭資料 send(sock,0); send(sock,ServerType,strlen(ServerType),ContentLen,strlen(ContentLen),ContentType,strlen(ContentType),0); // 傳輸資料 while (fgets(buffer,BUF_SIZE,fp) != NULL) send(sock,buffer,strlen(buffer),0); closesocket(sock); } } unsigned WINAPI RequestHandle(void *argv) { SOCKET hClntSock = (SOCKET)argv; char Buffer[BUF_SIZE] = { 0 }; char Method[BUF_SMALL] = { 0 }; char FileName[BUF_SMALL] = { 0 }; recv(hClntSock,Buffer,0); // 尋找HTTP請求頭 如果不為空則繼續 if (strstr(Buffer,"HTTP/1") != NULL) { // 接著判斷是否為GET請求方式 strcpy(Method,strtok(Buffer,"/")); if (strcmp(Method,"GET") != 0) { strcpy(FileName,strtok(0,"/")); printf("請求方式: %s 請求檔案: %s \n",Method,FileName); SendData(hClntSock,FileName); closesocket(hClntSock); return 0; } } Send_404(hClntSock); closesocket(hClntSock); return -1; } int main(int argc,char * argv[]) { WSADATA wsaData; SOCKET ServerSock,ClientSock; SOCKADDR_IN ServerAddr,ClientAddr; WSAStartup(MAKEWORD(2,2),&wsaData); ServerSock = socket(PF_INET,SOCK_STREAM,0); memset(&ServerAddr,sizeof(ServerAddr)); ServerAddr.sin_family = AF_INET; ServerAddr.sin_addr.s_addr = htonl(INADDR_ANY); ServerAddr.sin_port = htons(80); bind(ServerSock,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)); listen(ServerSock,10); while (1) { HANDLE hThread; DWORD dwThreadID; int ClientAddrSize; ClientAddrSize = sizeof(ClientAddr); ClientSock = accept(ServerSock,(SOCKADDR *)&ClientAddr,&ClientAddrSize); printf("請求客戶端 IP: %s --> 埠: %d \n",inet_ntoa(ClientAddr.sin_addr),ntohs(ClientAddr.sin_port)); hThread = (HANDLE)_beginthreadex(0,RequestHandle,(void *)ClientSock,(unsigned *)&dwThreadID); } closesocket(ServerSock); WSACleanup(); return 0; }
以上就是C/C++ 實現簡易HTTP伺服器的示例的詳細內容,更多關於C/C++ 實現簡易HTTP伺服器的資料請關注我們其它相關文章!