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

         

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


Теперь опишу программу клиента, который будет отправлять данные на сервер. Создайте новый проект Win32 Project и назовите его UDPClient. В данном случае можно обойтись без дополнительных потоков и отправить данные прямо из функции _tWinMain. Это связано с тем, что передача по протоколу UDP не делает задержек, и данные могут отправляться практически мгновенно. Поэтому не имеет смысла делать многозадачное приложение, что значительно упрощает задачу.

Откройте файл UDPClient.cpp и перед циклом обработки событий напишите код из листинга 4.17.

Листинг 4.17. Отправка данных UDP-серверу
WSADATA wsd; if (WSAStartup(MAKEWORD(2,2), wsd) != 0) { MessageBox(0, "Can't load WinSock", "Error", 0); return 0; }

SOCKET sSocket; struct sockaddr_in servaddr; char szServerName[1024], szMessage[1024]; struct hostent *host = NULL;

strcpy(szMessage, "This is message from client"); strcpy(szServerName, "127.0.0.1");

sSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sSocket == INVALID_SOCKET) { MessageBox(0, "Can't create socket", "Error", 0); return 0; } servaddr.sin_family = AF_INET; servaddr.sin_port = htons(5050); servaddr.sin_addr.s_addr = inet_addr(szServerName);

if (servaddr.sin_addr.s_addr == INADDR_NONE) { host = gethostbyname(szServerName); if (host == NULL) { MessageBox(0, "Unable to resolve server", "Error", 0); return 1; } CopyMemory(servaddr.sin_addr, host-h_addr_list[0], host-h_length); }

sendto(sSocket, szMessage, 30, 0, (struct sockaddr *)servaddr, sizeof(servaddr));

Как и в случае с сервером, необходимо создать сокет, у которого в качестве второго параметра указано значение SOCK_DGRAM. Третий параметр определяет протокол, в данном случае это IPPROTO_UDP.

После этого заполняется переменная servaddr типа sockaddr_in, которая содержит адрес и порт компьютера, которому нужно отправить данные. Если в качестве адреса указано символьное имя, то оно преобразуется в IP-адрес так же, как и при ТСР-клиенте.


Теперь можно напрямую без соединения с сервером отправлять данные функцией sendto. В данном случае серверу отправляется содержимое переменной szMessage.



Не забывайте, что для компиляции примеров, использующих работу с сетью, необходимо подключить библиотеку ws2_32.lib (см. разд. 4.7.1).

Примечание
Исходный код примера, описанного в этом разделе, вы можете найти на компакт - диске в каталоге \Demo\Chapter4\UDPCIient.

Содержание раздела