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

на главную

Жанры

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

55 wildaddr.sin_addr.s_addr = htonl(INADDR_ANY);

56 wildaddr.sin_port = htons(SERV_PORT);

57 Bind(sockfd, (SA*)&wildaddr, sizeof(wildaddr));

58 printf("bound %s\n", Sock_ntop((SA*)&wildaddr, sizeof(wildaddr)));

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

60 mydg_echo(sockfd, (SA*)&cliaddr, sizeof(cliaddr), (SA*)sa);

61 exit(0); /*
не выполняется */

62 }

63 exit(0);

64 }

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

50-62
Создается сокет UDP, устанавливается параметр сокета
SO_REUSEADDR
и происходит связывание с универсальным IP-адресом. Порождается дочерний процесс, вызывающий функцию
mydg_echo
.

Завершение работы функции main

63
Функция
main
завершается, и сервер продолжает выполнять работу, как и все порожденные дочерние процессы.

Функция

mydg_echo
, которая выполняется всеми дочерними процессами, показана в листинге 22.16.

Листинг 22.16. Функция mydg_echo

//advio/udpserv03.c

65 void

66 mydg_echo(int sockfd, SA *pcliaddr, socklen_t clilen, SA *myaddr)

67 {

68 int n;

69 char mesg[MAXLINE];

70 socklen_t len;

71 for (;;) {

72 len = clilen;

73 n = Recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);

74 printf("child %d, datagram from %s", getpid,

75 Sock_ntop(pcliaddr, len));

76 printf(", to %s\n", Sock_ntop(myaddr, clilen));

77 Sendto(sockfd, mesg, n, 0, pcliaddr, len);

78 }

79 }

Новый аргумент

65-66
Четвертым аргументом этой функции является IP-адрес, связанный с сокетом. Этот сокет должен получать только дейтаграммы, предназначенные для данного IP-адреса. Если IP-адрес является универсальным, сокет должен получать только те дейтаграммы, которые не подходят ни для какого другого сокета, связанного с тем же портом.

Чтение дейтаграммы и отражение ответа

71-78
Дейтаграмма читается с помощью функции
recvfrom
и отправляется клиенту обратно с помощью функции
sendto
. Эта функция также выводит IP-адрес клиента и IP-адрес, который был связан с сокетом.

Запустим эту программу на нашем узле

solaris
после установки псевдонима
для интерфейса
hme0
Ethernet. Адрес псевдонима: узел 200 в сети 10.0.0/24.

solaris % udpserv03

bound 127.0.0.1:9877 интерфейс закольцовки

bound 10.0.0.200:9877 направленный адрес интерфейса hme0:1

bound 10.0.0.255:9877 широковещательный адрес интерфейса hme0:1

bound 192.168.1.20:9877 направленный адрес интерфейса hme0

bound 192.168.1.255:9877 широковещательный адрес интерфейса hme0

bound 0.0.0.0.9877 универсальный адрес

При помощи утилиты

netstat
мы можем проверить, что все сокеты связаны с указанными IP-адресами и портом:

solaris % netstat -na | grep 9877

127.0.0.1.9877 Idle

10.0.0.200.9877 Idle

*.9877 Idle

192.129.100.100.9877 Idle

*.9877 Idle

*.9877 Idle

Следует отметить, что для простоты мы создаем по одному дочернему процессу на сокет, хотя возможны другие варианты. Например, чтобы ограничить число процессов, программа может управлять всеми дескрипторами сама, используя функцию

select
и не вызывая функцию
fork
. Проблема в данном случае будет заключаться в усложнении кода. Хотя использовать функцию
select
для всех дескрипторов несложно, нам придется осуществить некоторое сопоставление каждого дескриптора связанному с ним IP-адресу (вероятно, с помощью массива структур), чтобы иметь возможность вывести IP-адрес получателя после того, как на определенном сокете получена дейтаграмма. Часто бывает проще использовать отдельный процесс или поток для каждой операции или дескриптора вместо мультиплексирования множества различных операций или дескрипторов одним процессом.

22.7. Параллельные серверы UDP

Большинство серверов UDP являются последовательными (iterative): сервер ждет запрос клиента, считывает запрос, обрабатывает его, отправляет обратно ответ и затем ждет следующий клиентский запрос. Но когда обработка запроса клиента занимает длительное время, желательно так или иначе совместить во времени обработку различных запросов.

Определение «длительное время» означает, что другой клиент вынужден ждать в течение некоторого заметного для него промежутка времени, пока обслуживается текущий клиент. Например, если два клиентских запроса приходят в течение 10 мс и предоставление сервиса каждому клиенту занимает в среднем 5 с, то второй клиент будет вынужден ждать ответа около 10 с вместо 5 с (если бы запрос был принят в обработку сразу же по прибытии).

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

Подаренная чёрному дракону

Лунёва Мария
Любовные романы:
любовно-фантастические романы
7.07
рейтинг книги
Подаренная чёрному дракону

Истребитель. Ас из будущего

Корчевский Юрий Григорьевич
Фантастика:
боевая фантастика
попаданцы
альтернативная история
5.25
рейтинг книги
Истребитель. Ас из будущего

На границе империй. Том 9. Часть 3

INDIGO
16. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 3

Сирота

Ланцов Михаил Алексеевич
1. Помещик
Фантастика:
альтернативная история
5.71
рейтинг книги
Сирота

Провинциал. Книга 8

Лопарев Игорь Викторович
8. Провинциал
Фантастика:
боевая фантастика
космическая фантастика
аниме
5.00
рейтинг книги
Провинциал. Книга 8

Генерал Скала и ученица

Суббота Светлана
2. Генерал Скала и Лидия
Любовные романы:
любовно-фантастические романы
6.30
рейтинг книги
Генерал Скала и ученица

Особое назначение

Тесленок Кирилл Геннадьевич
2. Гарем вне закона
Фантастика:
фэнтези
6.89
рейтинг книги
Особое назначение

Имперец. Том 5

Романов Михаил Яковлевич
4. Имперец
Фантастика:
попаданцы
альтернативная история
аниме
6.00
рейтинг книги
Имперец. Том 5

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Возвышение Меркурия. Книга 7

Кронос Александр
7. Меркурий
Фантастика:
героическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 7

Возвышение Меркурия. Книга 14

Кронос Александр
14. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 14

Последний попаданец

Зубов Константин
1. Последний попаданец
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Последний попаданец

Жена со скидкой, или Случайный брак

Ардова Алиса
Любовные романы:
любовно-фантастические романы
8.15
рейтинг книги
Жена со скидкой, или Случайный брак

Кодекс Охотника. Книга ХХ

Винокуров Юрий
20. Кодекс Охотника
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга ХХ