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


Пример работы TCP-клиента - часть 2


// Отправка и прием данных ret = send(sClient, szMessage, strlen(szMessage), 0); if (ret == SOCKET_ERROR) { MessageBox(0, "send failed", "Error", 0); }

// Задержка Sleep(1000);

// Получение данных char szRecvBuff[1024]; ret = recv(sClient, szRecvBuff, 1024, 0); if (ret == SOCKET_ERROR) { MessageBox(0, "recv failed", "Error", 0); } MessageBox(0, szRecvBuff, "Recived data", 0); closesocket(sClient); }

Давайте подробно рассмотрим, что здесь происходит. В переменной szMessage хранится текст сообщения, которое отправляется серверу. Для примера жестко определена строка "get". В переменной szServerName указывается адрес сервера, с которым нужно произвести соединение. В данном случае установлен адрес 127.0.0.1, что соответствует локальному компьютеру. Это значит, что серверная и клиентская программы должны запуститься на одном и том же компьютере. После этого создается сокет так же, как и при создании сервера.

Следующим этапом надо подготовить структуру типа sockaddr_in (в нашем случае это структура server), в которой нужно указать семейство протоколов, порт (у сервера мы использовали 5050) и адрес сервера.

В примере указан IP-адрес, но в реальной программе у вас может быть и имя удаленного компьютера, которое нужно привести к IP. Именно поэтому адрес проверяется на равенство константе INADDR_NONE:

if (server.sin_addr.s_addr == INADDR_ NONE)

Если условие выполняется, то в качестве адреса указано символьное имя, и тогда с помощью функции gethostbyname выполняется преобразование в IP-адрес. Результат записывается в переменную типа hostent. Как я уже говорил, компьютер может иметь несколько адресов, тогда результатом будет массив структур типа hostent. Чтобы не усложнять задачу, просто возьмите первый адрес, который можно получить так: host->h_addr_list[0].

Теперь все готово к соединению с сервером. Для этого будет использоваться функция connect. Ей указывается созданный сокет, структура с адресом и размер структуры. Если функция вернет значение, отличное от SOCKET_ERROR, т о соединение прошло успешно, иначе произошла ошибка.




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



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