Программирование на C++ глазами хакера


Пример работы TCP-клиента


Сервер готов, теперь можно приступить к написанию клиентской части. Для этого создайте новый проект Win32 Project и назовите его TCPClient.

Найдите функцию _tWinMain и до цикла обработки сообщений добавьте следующий код:

WSADATA wsd; if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) { MessageBox(0, "Can't load WinSock", "Error", 0); return 0; }

HANDLE hNetThread; DWORD dwNetThreadId; hNetThread = CreateThread(NULL, 0, NetThread, 0, 0, &dwNetThreadId);

Здесь также загружается библиотека WinSock версии 2.2, хотя функции будут использоваться только из первой версии и достаточно было бы ее. Но я напоминаю, что в более новой версии могут быть исправлены какие-то ошибки, и в учебных целях я решил использовать эту версию.

Как и в случае с сервером, для работы с сетью будет использоваться отдельный поток, но для клиента достаточно только одного. Он также создается функцией CreateThread, а в качестве третьего параметра передается имя функции, которая будет выполняться в отдельном потоке — NetThread. Ее еще нет в созданном проекте, поэтому давайте введем сейчас. Добавьте до функции _tWinMain код из листинга 4.13.

Листинг 4.13. Поток работы с сетью
DWORD WINAPI NetThread(LPVOID lpParam) { SOCKET sClient; char szBuffer[1024]; int ret, i; struct sockaddr_in server; struct hostent *host = NULL; char szServerName[1024], szMessage[1024];

strcpy(szMessage, "get"); strcpy(szServerName, "127.0.0.1");

// Создание сокета sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (sClient == INVALID_SOCKET) { MessageBox(0, "Can't create socket", "Error", 0); return 1; } // Заполнение структуры с адресом сервера и номером порта server.sin_family = AF_INET; server.sin_port = htons(5050); server.sin_addr.s_addr = inet_addr(szServerName);

// Если указано имя, то перевод символьного адреса сервера в IP if (server.sin_addr.s_addr == INADDR_NONE) { host = gethostbyname(szServerName); if (host == NULL) { MessageBox(0, "Unable to resolve server", "Error", 0); return 1; } CopyMemory(&server.sin_addr, host->h_addr_list[0], host->h_length); } // Соединение с сервером if (connect(sClient, (struct sockaddr *)&server, sizeof(server)) == SOCKET_ERROR) { MessageBox(0, "connect failed", "Error", 0); return 1; }




Начало  Назад  Вперед



Книжный магазин