/**************************************************************************** * client.cpp * Example Winsock client * **************************************************************************** * 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 LocalSin, RemoteSin; } 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) { 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 = "GenericClientClass"; wnd.lpszMenuName = NULL; wnd.style = CS_HREDRAW | CS_VREDRAW; RegisterClass(&wnd); Main.hWnd = CreateWindow("GenericClientClass", "Connecting to port 1234...", WS_CAPTION | WS_POPUPWINDOW, 0, 100, 200, 100, NULL, NULL, Main.hInst, NULL); if (!Main.hWnd) return -2; ShowWindow(Main.hWnd, SW_SHOWNORMAL); if (!InitSocket(1234)) { char szBuffer[1024]; sprintf(szBuffer, "Error connecting [%d]", WSAGetLastError()); MessageBox(Main.hWnd, szBuffer, "Error", MB_OK); DestroyWindow(Main.hWnd); } MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } WSACleanup(); return msg.wParam; } int InitSocket(int nPort) { Main.LocalSin.sin_family = AF_INET; Main.LocalSin.sin_port = 0; Main.RemoteSin.sin_family = AF_INET; Main.RemoteSin.sin_port = htons(nPort); if ((Main.RemoteSin.sin_addr.S_un.S_addr = inet_addr("127.0.0.1")) == INADDR_NONE) return false; // Error setting IP if ((Main.Sock = socket(PF_INET, SOCK_STREAM, 0)) == SOCKET_ERROR) return false; // Error creating socket if (bind(Main.Sock, (sockaddr *)&Main.LocalSin, sizeof(sockaddr_in)) == SOCKET_ERROR) return false; // Error binding socket if (connect(Main.Sock, (sockaddr *)&Main.RemoteSin, sizeof(sockaddr_in)) == SOCKET_ERROR) return false; WSAAsyncSelect(Main.Sock, Main.hWnd, WM_USER + 2, FD_READ | FD_CLOSE); 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 + 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; }