Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:
ПРИМЕЧАНИЕ

Беркли-реализации реализуют эту «защиту от дурака» (sanity check). Однако Solaris 2.5 принимает дейтаграмму, предназначенную для широковещательного адреса, даже если мы не задаем параметр сокета SO_BROADCAST. Стандарт POSIX требует установки параметра сокета SO_BROADCAST для отправки широковещательной дейтаграммы.

В 4.2BSD широковещательная передача была привилегированной операцией, и параметра сокета SO_BROADCAST не существовало. В 4.3BSD этот параметр был добавлен и каждому процессу стало разрешено его устанавливать.

Теперь мы изменим нашу функцию

dg_cli
, как показано в листинге 20.1 [1] . Эта версия устанавливает параметр сокета
SO_BROADCAST
и выводит все ответы, полученные в течение 5 с.

Листинг 20.1. Функция dg_cli, осуществляющая широковещательную передачу

//bcast/dgclibcast1.c

1 #include "unp.h"

2 static void recvfrom_alarm(int);

1

Все исходные коды программ, опубликованные в этой книге, вы можете найти по адресу http://www.piter.com.

3 void

4 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)

5 {

6 int n;

7 const int on = 1;

8 char sendline[MAXLINE], recvline[MAXLINE + 1];

9 socklen_t len;

10 struct sockaddr *preply_addr;

11 preply_addr = Malloc(servlen);

12 Setsockopt(sockfd, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on));

13 Signal(SIGALRM, recvfrom_alarm);

14 while (Fgets(sendline, MAXLINE, fp) != NULL) {

15 Sendto(sockfd, sendline, strlen(sendline), 0, pservaddr, servlen);

16 alarm(5);

17 for (;;) {

18 len = servlen;

19 n = recvfrom(sockfd, recvline, MAXLINE, 0, preply_addr, &len);

20 if (n < 0) {

21 if (errno == EINTR)

22 break; /* окончание ожидания ответов */

23 else

24 err_sys("recvfrom error");

25 } else {

26 recvline[n] = 0; /* завершающий нуль */

27 printf("from %s: %s",

28 Sock_ntop_host(preply_addr, len), recvline);

29 }

30 }

31 }

32 free(preply_addr);

33 }

34 static void

35 recvfrom_alarm(int signo)

36 {

37 return; /* прерывание recvfrom */

38 }

Выделение памяти для адреса сервера, установка параметра сокета

11-13
Функция
malloc
выделяет в памяти пространство для адреса сервера, возвращаемого функцией
recvfrom
. Устанавливается параметр сокета
SO_BROADCAST
, устанавливается обработчик сигнала
SIGALRM
.

Чтение строки, отправка сокету, чтение всех ответов

14-24
Следующие два вызова,
fgets
и
sendto
, выполняются так же, как и в предыдущих версиях этой функции. Но поскольку мы посылаем широковещательную дейтаграмму, мы можем получить множество ответов. Мы вызываем в цикле функцию
recvfrom
и выводим все ответы, полученные в течение 5 с. По истечении 5 с генерируется сигнал
SIGALRM
, вызывается наш обработчик сигнала и функция
recvfrom
возвращает ошибку
EINTR
.

  • Читать дальше
  • 1
  • ...
  • 273
  • 274
  • 275
  • 276
  • 277
  • 278
  • 279
  • 280
  • 281
  • 282
  • 283
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: