#pragma comment(lib, "ws2_32") #include #include #include #define H_MAX 1500 typedef struct ClientPack{ char *szIP; SOCKET sSocket; }CLIENTPACK, *PCLIENTPACK; DWORD WINAPI Handler(LPVOID lpParam); void HandleError(int nErrorCode); char *GetEntireFile(LPSTR path); 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); SOCKET sClient; sockaddr_in RemoteInfo; while(TRUE){ Sleep(1); int nRemoteInfoSize = sizeof(RemoteInfo); sClient = accept(sListen, (sockaddr*)&RemoteInfo, &nRemoteInfoSize); if(sClient != 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[H_MAX]; int nRecvCount = recv(ClientPack->sSocket, szRcvBuff, sizeof(szRcvBuff), 0); if(nRecvCount == SOCKET_ERROR){ int nError = WSAGetLastError(); HandleError(nError); } HANDLE hFile = CreateFile("C:\\miniWWW\\index.html", GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DWORD fdwSize = GetFileSize(hFile, NULL); DWORD fdwRead = 0; char *szFile = (char*)malloc(fdwSize + 1); ReadFile(hFile, szFile, fdwSize, &fdwRead, NULL); char szHeader[1024]; sprintf((char*)&szHeader, "HTTP/1.0 200 OK\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n", fdwSize); strcat(szHeader, szFile); int nSend = send(ClientPack->sSocket, szHeader, strlen(szHeader), 0); if(nSend == SOCKET_ERROR) HandleError(WSAGetLastError()); closesocket(ClientPack->sSocket); free(szFile); CloseHandle(hFile); return 0 ; } void HandleError(int nErrorCode) { switch(nErrorCode) { case 10054: printf(" [e] Connection reset by peer!\n"); break; case 10038: printf(" [e] Operation attempted on invalid socket!\n"); break; case 10060: printf(" [e] Connection timed out!\n"); break; case 10061: printf(" [e] Connection refused!\n"); break; default: printf(" [e] Unknown error: %d", nErrorCode); break; } }