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

Пример работы UDP-сервера


Создайте новый проект Win32 Project и назовите его UDP Server. Откройте файл UDPServer . cpp и добавьте в функцию _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);

Как и в случае с TCP-сервером загружается библиотека WinSock и создается новый поток, в котором и будет происходить работа с сетью. Сама функция потока показана в листинге 4.16.

Листинг 4.16. Функция работы с сетью
DWORD WINAPI NetThread(LPVOID lpParam) { SOCKET sServerListen; struct sockaddr_in localaddr, clientaddr; int iSize;

sServerListen = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); if (sServerListen == INVALID_SOCKET) { MessageBox(0, "Can't create socket", "Error", 0); return 0; } localaddr.sin_addr.s_addr = htonl(INADDR_ANY); localaddr.sin_family = AF_INET; localaddr.sin_port = htons(5050);

if (bind(sServerListen, (struct sockaddr *)localaddr, sizeof(localaddr)) == SOCKET_ERROR) { MessageBox(0, "Can't bind", "Error", 0); return 1; }

MessageBox(0, "Bind OK", "Warning", 0);

char buf[1024];

while (1) { iSize = sizeof(clientaddr); int ret = recvfrom(sServerListen, buf, 1024, 0, (struct sockaddr *)clientaddr, iSize); MessageBox(0, buf, "Warning", 0); } closesocket(sServerListen); return 0; }

Во время создания сокета функцией socket, указывается параметр SOCK_DGRAM, что означает необходимость использования протокола, основанного на сообщениях. В качестве последнего параметра нужно указать константу, точно определяющую протокол. В данном случае можно явно указать UDP -протокол с помощью константы IPPROTO_UDP или просто указать значение 0.

Все остальное вам уже должно быть понятно. После создания сокета нужно привязать его к локальному адресу функцией bind. Для UDP-сервера этого достаточно. В примере после связывания сокета запускается бесконечный цикл, который вызывает функцию recvfrom для получения данных от клиента.

При получении данных сервер просто выводит на экран окно с полученной информацией. Адрес отправителя сохраняется в переменной clientaddr, и его можно использовать для отправки ответа клиенту.

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



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