Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

16 else

17 err_quit("usage; udpserv04 [ <host> ] <service or port>");

18 family = sa->sa_family;

19 port = sock_get_port(sa, salen);

20 Close(sockfd); /* хотим узнать семейство, порт salen */

21 for (ifihead = ifi = Get_ifi_info(family, 1),

22 ifi ! = NULL; ifi = ifi->ifi_next) {

23 /*
связывание с многоадресными адресами */

24 sockfd = Socket(family, SOCK_DGRAM, 0);

25 Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

26 sock_set_port(ifi->ifi_addr, salen, port);

27 Bind(sockfd, ifi->ifi_addr, salen);

28 printf("bound %s\n", Sock_ntop(ifi->ifi_addr, salen));

29 if ((pid = Fork) == 0) { /* дочерний процесс */

30 mydg_echo(sockfd, ifi->ifi_addr, salen);

31 exit(0); /* никогда не выполняется */

32 }

33 if (ifi->ifi_flags & IFF_BROADCAST) {

34 /* попытка связывания с широковещательным адресом */

35 sockfd = Socket(family, SOCK_DGRAM, 0);

36 Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

37 sock_set_port(ifi->ifi_brdaddr, salen, port);

38 if (bind(sockfd, ifi->ifi_brdaddr, salen) < 0) {

39 if (errno == EADDRINUSE) {

40 printf("EADDRINUSE: %s\n",

41 Sock_ntop(ifi->ifi_brdaddr, salen));

42 Close(sockfd);

43 continue;

44 } else

45 err_sys("bind error for %s",

46 Sock_ntop(ifi->ifi_brdaddr, salen));

47 }

48 printf ("bound %s\n", Sock_ntop(ifi->ifi_brdaddr, salen));

49 if ((pid = Fork) == 0) { /* дочерний процесс */

50 mydg_echo(sockfd, ifi->ifi_brdaddr, salen);

51 exit(0); /* никогда не выполняется */

52 }

53 }

54 }

55 /*
связывание с универсальным адресом */

56 sockfd = Socket(family, SOCK_DGRAM, 0);

57 Setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

58 wild = Malloc(salen);

59 memcpy(wild, sa, salen); /* копирует семейство и порт */

60 sock_set_wild(wild, salen);

61 Bind(sockfd, wild, salen);

62 printf("bound %s\n", Sock_ntop(wild, salen));

63 if ((pid = Fork) == 0) { /* дочерний процесс */

64 mydg_echo(sockfd, wild, salen);

65 exit(0); /* никогда не выполняется */

66 }

67 exit(0);

68 }

69 void

70 mydg_echo(int sockfd, SA *myaddr, socklen_t salen)

71 {

72 int n;

73 char mesg[MAXLINE];

74 socklen_t len;

75 struct sockaddr *cli;

76 cli = Malloc(salen);

77 for (;;) {

78 len = salen;

79 n = Recvfrom(sockfd, mesg, MAXLINE, 0, cli, &len);

80 printf("child %d, datagram from %s",

81 getpid, Sock_ntop(cli, len));

82 printf(", to %s\n", Sock_ntop(myaddr, salen));

83 Sendto(sockfd, mesg, n, 0, cli, len),

84 }

85 }

Глава 24

24.1. Да, разница есть. В первом примере два байта отсылаются с единственным срочным указателем, который указывает на байт, следующий за

b
. Во втором же примере (вызываются две функции) сначала отсылается символ
a
с указателем срочности, который указывает на следующий за ним байт, а за этим сегментом следует еще один TCP-сегмент, содержащий символ
b
с другим указателем срочности, указывающим на следующий за ним байт.

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

Отморозки

Земляной Андрей Борисович
Фантастика:
научная фантастика
7.00
рейтинг книги
Отморозки

Цеховик. Книга 2. Движение к цели

Ромов Дмитрий
2. Цеховик
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Цеховик. Книга 2. Движение к цели

Гримуар темного лорда V

Грехов Тимофей
5. Гримуар темного лорда
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Гримуар темного лорда V

Комендант некромантской общаги 2

Леденцовская Анна
2. Мир
Фантастика:
юмористическая фантастика
7.77
рейтинг книги
Комендант некромантской общаги 2

Попаданка в деле, или Ваш любимый доктор

Марей Соня
1. Попаданка в деле, или Ваш любимый доктор
Фантастика:
фэнтези
5.50
рейтинг книги
Попаданка в деле, или Ваш любимый доктор

Ведьмак. Назад в СССР

Подус Игорь
1. Ведьмак. Назад в СССР
Фантастика:
попаданцы
альтернативная история
6.60
рейтинг книги
Ведьмак. Назад в СССР

Здравствуй, 1984-й

Иванов Дмитрий
1. Девяностые
Фантастика:
альтернативная история
6.42
рейтинг книги
Здравствуй, 1984-й

Огромный. Злой. Зеленый

Новикова Татьяна О.
1. Большой. Зеленый... ОРК
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Огромный. Злой. Зеленый

Черный маг императора

Герда Александр
1. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Черный маг императора

Мое ускорение

Иванов Дмитрий
5. Девяностые
Фантастика:
попаданцы
альтернативная история
6.33
рейтинг книги
Мое ускорение

Вечный. Книга IV

Рокотов Алексей
4. Вечный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Вечный. Книга IV

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Матабар IV

Клеванский Кирилл Сергеевич
4. Матабар
Фантастика:
фэнтези
5.00
рейтинг книги
Матабар IV

Лорд Системы

Токсик Саша
1. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
4.00
рейтинг книги
Лорд Системы