/**************************************************************************** * server.cpp * Example Winsock server * **************************************************************************** * By: Jonathan Overholt http://overholt.org/jonathan/ * ****************************************************************************/ #include #include #include #pragma comment(lib, "wsock32.lib") struct MAIN { HINSTANCE hInst; HWND hWnd; SOCKET Sock; sockaddr_in Sin; } Main; int InitSocket(int nPort); int SendData(SOCKET sock, char * lpszData); LRESULT WINAPI WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); int HandleData(WPARAM wParam, LPARAM lParam); int HandleAccept(WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrev, char * lpCmdLine, int nShowCmd) { /* hPrev is NULL unless there's another instance running. We don't want two servers now, do we? */ if (hPrev) return -1; Main.hInst = hInst; WSAData wsa; WSAStartup(MAKEWORD(1, 1), &wsa); WNDCLASS wnd; wnd.cbClsExtra = 0; wnd.cbWndExtra = 0; wnd.hbrBackground = (HBRUSH) COLOR_WINDOW; wnd.hCursor = LoadCursor(NULL, IDC_ARROW); wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION); wnd.hInstance = Main.hInst; wnd.lpfnWndProc = WinProc; wnd.lpszClassName = "GenericServerClass"; wnd.lpszMenuName = NULL; wnd.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wnd); Main.hWnd = CreateWindow("GenericServerClass", "Serving on port 1234...", WS_CAPTION | WS_POPUPWINDOW, 0, 0, 200, 100, NULL, NULL, Main.hInst, NULL); if (!Main.hWnd) return -2; if (!InitSocket(1234)) { char szBuffer[1024]; sprintf(szBuffer, "Error initializing listening socket [%d]", WSAGetLastError()); MessageBox(Main.hWnd, szBuffer, "Error", MB_OK); } ShowWindow(Main.hWnd, SW_SHOWNORMAL); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } WSACleanup(); return msg.wParam; } int InitSocket(int nPort) { if ((Main.Sock = socket(PF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) return FALSE; Main.Sin.sin_family = AF_INET; Main.Sin.sin_port = htons(nPort); if (bind(Main.Sock, (sockaddr *)&Main.Sin, sizeof(sockaddr_in)) == SOCKET_ERROR) return FALSE; if (listen(Main.Sock, 200) == SOCKET_ERROR) return FALSE; WSAAsyncSelect(Main.Sock, Main.hWnd, WM_USER + 1, FD_ACCEPT); return TRUE; } int SendData(SOCKET sock, char * lpszData) { return send(sock, lpszData, strlen(lpszData), 0); } LRESULT WINAPI WinProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_DESTROY: PostQuitMessage(0); break; case WM_USER + 1: HandleAccept(wParam, lParam); break; case WM_USER + 2: HandleData(wParam, lParam); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } int HandleData(WPARAM wParam, LPARAM lParam) { SOCKET sock = (SOCKET)wParam; WORD event = LOWORD(lParam); WORD error = HIWORD(lParam); if (event == FD_CLOSE) { closesocket(sock); } else if (event == FD_READ) { char szBuffer[1024]; ZeroMemory(szBuffer, 1024); recv(sock, szBuffer, 1024, 0); MessageBox(Main.hWnd, szBuffer, "Received Data!", MB_OK); closesocket(sock); } return TRUE; } int HandleAccept(WPARAM wParam, LPARAM lParam) { SOCKET sock = (SOCKET)wParam; WORD event = LOWORD(lParam); WORD error = HIWORD(lParam); if (event == FD_ACCEPT) { sockaddr_in NewRemoteSin; SOCKET newsock = accept(sock, (sockaddr*)&NewRemoteSin, NULL); WSAAsyncSelect(newsock, Main.hWnd, WM_USER + 2, FD_READ | FD_CLOSE); SendData(newsock, "Hello, welcome to my server."); } return TRUE; }