Рассмотрим пример использования широковещательных пакетов. Допустим, что вам нужно написать программу, которая будет рассылать всем компьютерам в сети определенное сообщение. Конечно же, можно воспользоваться командой NET SEND, но она не работает в Windows 9х, имеет ограничения и неудобства. Давайте посмотрим, как эффективно решить эту проблему программно.

Итак, вам нужно написать сервер, который будет установлен на всех компьютерах и который будет прослушивать определенный порт. Клиентская программа должна будет отправлять всем какое-то сообщение. Можно искать все компьютеры в сети и отправлять им личные сообщения, но намного эффективнее будет отправить один пакет, который может быть получен всеми в вашей сети.

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

Листинг 5.13. Отправка широковещательных пакетов

procedure TForml.SendButtonClick(Sender: TObject): var
s: TSocket:
sock: TSockAddrln;
b: Boolean:

sRecvStr: array [0..255] of char; wData: WSADATA: begin // Загрузка сетевой библиотеки

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

// Создание сокета для работы по UDP

s := socket(AF_INET, SOCK_DGRAM, IPPROTOJDP);

// Перевод сокета в режим широковещания b := true:

setsockopt(s. S0L_S0CKET, S0_BR0ADCAST. @b. sizeof(Boolean)):
// Заполняем адрес получателя sock.sin_addr.s_addr := htonl(INADDR_ANY): sock.sinjfamily := AF_INET: sock.sin_port .= htons(5050);
sock.sin_addr.S_addr := inet_addr('255.255.255.255'):

// Отправка сообщения

sRecvStr := 'Тестовое сообщение':

if SendTo(s. sRecvStr. 17. 0. sock. SizeOf(sock)) = S0CKET_ERR0R then b •= false:

// Закрываем сокет closesocket(s):

end, После загрузки сетевой библиотеки мы создаем сокет для работы с протоколом UDP. Широковещательные пакеты можно отправлять только по такому протоколу, который не устанавливает соединение.

После этого сокет "насильно" переводится в режим широковещания с помощью функции setsockopt, которую мы рассматривали в главе 4.

При заполнении структуры адреса в качестве адреса получателя указывается 255.255.255.255. Это специально зарезервированный адрес для широковещания. Подготовив структуру с адресом и номером порта, отправляем текстовое сообщение с использованием уже знакомой нам функции SendTo, которая предназначена для работы по протоколу без установки соединения.

ПРИМЕЧАНИЕ -

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

5.6. HTTP-клиент || Оглавление || 5.8. Открытые папки


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