#pragma comment(lib, "ws2_32") #include #include #include typedef struct ClientPack{ char *szIP; SOCKET sSocket; }CLIENTPACK, *PCLIENTPACK; DWORD WINAPI Handler(LPVOID lpParam); int main(int argc, char **argv) { int nPort = 0; printf("Enter listen port: "); scanf("%i", &nPort); MessageBeep(MB_ICONERROR); WSADATA wsaData; if(WSAStartup(MAKEWORD(2, 0), &wsaData) != 0){ WSACleanup(); printf("\n\n[1] Failed to Initialize winsock!\n\n"); getchar(); return -1; } printf("\n\n[1] Initiated Winsock...\n\n"); SOCKET sListen = NULL; if((sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET){ WSACleanup(); printf("[2] Failed to create socket!\n\n"); getchar(); return -1; } SOCKADDR_IN SockInfo; SockInfo.sin_addr.s_addr = INADDR_ANY; SockInfo.sin_family = AF_INET; SockInfo.sin_port = htons(nPort); if(bind(sListen, (SOCKADDR*)&SockInfo, sizeof(SockInfo)) == SOCKET_ERROR){ printf("[3] Failed to bind socket!\n\n"); closesocket(sListen); WSACleanup(); getchar(); return -1; } printf("[3] Socket bound!\n\n"); if(listen(sListen, SOMAXCONN) == SOCKET_ERROR){ printf("[4] Failed to listen on given port!\n\n"); closesocket(sListen); WSACleanup(); getchar(); return -1; } printf("[4] Now listening on port %d!\n\n", nPort); while(TRUE){ Sleep(10); SOCKET sClient = NULL; sockaddr_in RemoteInfo; int nRemoteInfoSize = sizeof(RemoteInfo); if(sClient = accept(sListen, (sockaddr*)&RemoteInfo, &nRemoteInfoSize) != INVALID_SOCKET){ printf("New Connection: %s\n", inet_ntoa(RemoteInfo.sin_addr)); CLIENTPACK ClientPack; ClientPack.sSocket = sClient; ClientPack.szIP = inet_ntoa(RemoteInfo.sin_addr); CreateThread(0, NULL, (LPTHREAD_START_ROUTINE)&Handler, (void*)&ClientPack, NULL, NULL); } } return 0; } DWORD WINAPI Handler(LPVOID lpParam) { PCLIENTPACK ClientPack = (PCLIENTPACK)lpParam; char *szRcvBuff = (char*)malloc(1024*1024); do{ recv(ClientPack->sSocket, szRcvBuff, strlen(szRcvBuff), 0); }while(strstr(szRcvBuff, "\r\n\r\n") == NULL); char szSend[] = "HTTP/1.0 200 OK\r\nContent-Type:text/html\r\nContent-Length:10\r\n\r\n\r\nArizona\r\n\r\n"; send(ClientPack->sSocket, szSend, sizeof(szSend), 0); return 0; }