C/C++ 实现简易HTTP服务器的示例

#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 100void 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, Protocol, strlen(Protocol), 0);send(sock, ServerType, strlen(ServerType), 0);send(sock, ContentLen, strlen(ContentLen), 0);send(sock, 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, BUF_SIZE, 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, 0, 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, 0, RequestHandle, (void *)ClientSock, 0, (unsigned *)&dwThreadID);}closesocket(ServerSock);WSACleanup();return 0;}

以上就是C/C++ 实现简易HTTP服务器的示例的详细内容,更多关于C/C++ 实现简易HTTP服务器的资料请关注其它相关文章!

用敬业的精神去面对每一份挑战,

C/C++ 实现简易HTTP服务器的示例

相关文章:

你感兴趣的文章:

标签云: