Теперь на практике посмотрим, как создавать сетевые приложения, работающие по протоколу UDP. В листинге 4 7 приведен код запуска UDP-сервера.

Листинг 4.7. Код UDP-сервера

procedure TForml bStartServerClick(Sender: TObject): var
wData. WSADATA.
sServerListen: TSOCKET:
localaddr. clientaddr: sockaddr_in:
sRecvStr. array [0..255] of char.

iSize: Integer, begin // Загрузка WinSock

if WSAStartup(MAKEWORDd.l). wData) о 0 then begin
MessageBox(0, 'He могу загрузить WinSock'. 'Ошибка'. 0);
exit;
end;

// Создание сокета

sServerListen .= socket(AF_INET, SOCK_DGRAM. IPPROTOJDP);

if sServerListen = INVALID_SOCKET then begin MessageBox(0. 'Ошибка создания сокета' 'Ошибка'. 0), exitj

end, // Заполнение структуры адреса

localaddr sin_addr s_addr •= htonl(INAUDR_ANY);
localaddr sin_family = AF_INET;
localaddr sin_port := htons(5050).

// Связывание сокета с локальным адресом

if bind(sServerListen, localaddr sizeof(localaddr)) = SOCKETJRROR then begin
TestWinSockErrorC'Bind'). exit;
end:

// Прослушивание

iSize := sizeof(clientaddr);
if recvfrom(sServerListen, sRecvStr, 255. 0.
clientaddr. iSize) <>
SOCKETJRROR then Label 1.Captlon:=sRecvStr;
closesocket(sServerL i sten):
end:

При создании сокета в качестве второго параметра (тип спецификации) указывается флаг SOCKDGRAM. В третьем параметре используется флаг IPPROTO UDP, что соответствует UDP. Сокет связывается с локальным адресом и портом 5050, после чего сервер готов к использованию.

Обратите внимание, что если запустить наши TCP-сервер и UDP-сервер одновременно, ошибок не будет, хотя Программы используют один и тот же порт. Мы говорили, что только одна программа может открыть определенный порт, и если он уже открыт, то возникнет ошибка В данном случае ошибок не будет, потому что порты UDP не пересекаются с TCP.

Далее вызывается функция гесутгот. Здесь должны быть корректно заполнены первый параметр (созданный заранее сокет) и последний параметр (размер структуры типа БоскАс1(]г_1п). Во втором параметре необходим достаточный буфер для приема сообщения, в третьем параметре - корректный размер буфера, а в предпоследнем параметре задается указатель на структуру типа БоскА(](]г_1п для получения информации о компьютере, с которого пришло сообщение.

ПРИМЕЧАНИЕ

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге 5оигсе5\сп04\1ЮР5егуег.

Теперь рассмотрим, как работает клиентское приложение. В листинге 4.8 приведен код программы клиента.

Листинг 4.8. Код UDP-клиента

procedure TForml bSendDataClick(Sender TObject), var wData: WSADATA; sClientListen: TSOCKET: server_addr: sockaddr_in; sRecvStr: array [0..255] of char: begin // Загрузка WinSock

if WSAStartup(MAKEWORDd.l). wData) <> 0 then begin MessageBoxCO. 'He могу загрузить WinSock', 'Ошибка'. 0): exit:

end:

// Создание сокета

sClientListen := socket(AF_INET, SOCK_DGRAM, IPPROTOJJDP):
if sClientListen = INVALID_SOCKET then
begin
MessageBoxCO. 'Ошибка создания сокета'. 'Ошибка'. 0);
exit;
end;

// Заполнение структуры адреса server_addr.sm_addr.s_addr := htonl (INADDR_ANY); server_addr.sin_family = AF_INET; server_addr.sin_port := htons(5050): server_addr.sin_addr := LookupName(edServer.Text):

sRecvStr:='npnBeT. это тест': SendTo(sClientListen, sRecvStr, 16. 0. server_addr, Si zeOf(server_addr));
closesocket(sClientListen);
end:

Этот пример еще проще. Просто создаем сокет, заполняем структуру с адресом, и можно отправлять данные на сервер.

При создании клиентского сокета (вызове функции socket) отношение к параметрам намного "мягче". Это значит, что от вас требуется правильно указать только первые два параметра. Даже если в третьем параметре вы укажете не IPPROT0UDP, a IPPROT0IP, - ошибки не будет и программа отработает корректно, потому что протокол будет выбран по второму параметру (спецификация), где указан протокол без установки соединения.

ПРИМЕЧАНИЕ

Исходный код рассмотренного здесь примера находится на компакт-диске в каталоге Sources\ch04\UDPCIient.

4.11. Создание ТСР-клиента || Оглавление || 4.13. Сокеты в неблокирующем режиме


Delphi в шутку и всерьез: что умеют хакеры



Новости за месяц

  • Декабрь
    2021
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31