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
с другим указателем срочности, указывающим на следующий за ним байт.
Поделиться:
Популярные книги
Кодекс Крови. Книга III
3. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Отчий дом. Семейная хроника
Проза:
классическая проза
5.00
рейтинг книги
Скандальная свадьба
1. Такие разные свадьбы
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Путанабус. Трилогия
Фантастика:
боевая фантастика
6.93
рейтинг книги
Идеальный мир для Лекаря 25
25. Лекарь
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Кодекс Крови. Книга ХVI
16. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Проданная невеста
Любовные романы:
любовно-фантастические романы
5.80
рейтинг книги
Потомок бога
1. Локки
Фантастика:
попаданцы
альтернативная история
аниме
сказочная фантастика
5.00
рейтинг книги
С Д. Том 16
16. Сердце дракона
Фантастика:
боевая фантастика
6.94
рейтинг книги
Переиграть войну! Пенталогия
Переиграть войну!
Фантастика:
героическая фантастика
альтернативная история
8.25
рейтинг книги
От Советского Информбюро - 1941-1945 (Сборник)
Документальная литература:
биографии и мемуары
5.00
рейтинг книги

Санек 3
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Прометей: повелитель стали
3. Прометей
Фантастика:
фэнтези
7.05
рейтинг книги
Отмороженный 14.0
14. Отмороженный
Фантастика:
боевая фантастика
попаданцы
рпг
5.00