void main(void) { MSG msg; DWORD Ret; SOCKET Listen; SOCKADDR_IN InternetAddr; HWND Window; WSADATA wsaData; if ((Window = MakeWorkerWindow()) == NULL) return; // Prepare echo server if ((Ret = WSAStartup(0x0202, &wsaData)) != 0) { printf("WSAStartup failed with error %d\n", Ret); return; } if ((Listen = socket (PF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET) { printf("socket() failed with error %d\n", WSAGetLastError()); return; } WSAAsyncSelect(Listen, Window, WM_SOCKET, FD_ACCEPT|FD_CLOSE); InternetAddr.sin_family = AF_INET; InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY); InternetAddr.sin_port = htons(PORT); if (bind(Listen, (PSOCKADDR) &InternetAddr, sizeof(InternetAddr)) == SOCKET_ERROR) { printf("bind() failed with error %d\n", WSAGetLastError()); return; } if (listen(Listen, 5)) { printf("listen() failed with error %d\n", WSAGetLastError()); return; } // Translate and dispatch window messages for the application thread while(Ret = GetMessage(&msg, NULL, 0, 0)) { if (Ret == -1) { printf("GetMessage() failed with error %d\n", GetLastError()); return; } TranslateMessage(&msg); DispatchMessage(&msg); } }
// // Function: main // // Description: // This is the main program. It parses the command line and creates // the main socket. For UDP this socket is used to receive datagrams. // For TCP the socket is used to accept incoming client connections. // Each client TCP connection is handed off to a worker thread which // will receive any data on that connection until the connection is // closed. // int __cdecl main(int argc, char **argv) { WSADATA wsd; SOCKET_OBJ *sockobj=NULL, *sptr=NULL, *tmp=NULL; HANDLE hThread; ULONG lastprint=0; MSG msg; int rc; struct addrinfo *res=NULL, *ptr=NULL; ValidateArgs(argc, argv); InitializeCriticalSection(&gSocketCritSec); // Load winsock if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { fprintf(stderr, "unable to load Winsock!\n"); return -1; } gWorkerWindow = MakeWorkerWindow(); printf("Local address: %s; Port: %s; Family: %d\n", gBindAddr, gBindPort, gAddressFamily); res = ResolveAddress(gBindAddr, gBindPort, gAddressFamily, gSocketType, gProtocol); if (res == NULL) { fprintf(stderr, "ResolveAddress failed to return any addresses!\n"); return -1; } // For each local address returned, create a listening/receiving socket ptr = res; while (ptr) { PrintAddress(ptr->ai_addr, ptr->ai_addrlen); printf("\n"); sockobj = GetSocketObj(INVALID_SOCKET); // create the socket sockobj->s = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol); if (sockobj->s == INVALID_SOCKET) { fprintf(stderr,"socket failed: %d\n", WSAGetLastError()); return -1; } InsertSocketObj(sockobj); // bind the socket to a local address and port rc = bind(sockobj->s, ptr->ai_addr, ptr->ai_addrlen); if (rc == SOCKET_ERROR) { fprintf(stderr, "bind failed: %d\n", WSAGetLastError()); return -1; } if (gProtocol == IPPROTO_TCP) { rc = listen(sockobj->s, 200); if (rc == SOCKET_ERROR) { fprintf(stderr, "listen failed: %d\n", WSAGetLastError()); return -1; } // Register for notification rc = WSAAsyncSelect( sockobj->s, gWorkerWindow, WM_SOCKET, FD_ACCEPT | FD_CLOSE ); if (rc == SOCKET_ERROR) { fprintf(stderr, "WSAAsyncSelect failed: %d\n", WSAGetLastError()); return -1; } } else { // Register for notification rc = WSAAsyncSelect( sockobj->s, gWorkerWindow, WM_SOCKET, FD_READ | FD_WRITE | FD_CLOSE ); if (rc == SOCKET_ERROR) { fprintf(stderr, "WSAAsyncSelect failed: %d\n", WSAGetLastError()); return -1; } } ptr = ptr->ai_next; } // free the addrinfo structure for the 'bind' address freeaddrinfo(res); gStartTime = gStartTimeLast = lastprint = GetTickCount(); // Start a thread to print statistics hThread = CreateThread(NULL, 0, StatisticsThread, NULL, 0, NULL); if (hThread == NULL) { fprintf(stderr, "CreateThread failed: %d\n", WSAGetLastError()); return -1; } CloseHandle(hThread); while(rc = GetMessage(&msg, NULL, 0, 0)) { if (rc == -1) { fprintf(stderr, "GetMessage() failed with error %d\n", GetLastError()); return -1; } TranslateMessage(&msg); DispatchMessage(&msg); } WSACleanup(); DeleteCriticalSection(&gSocketCritSec); return 0; }