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

на главную

Жанры

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

7 bzero(&hints, sizeof(struct addrinfo));

8 hints.ai_family = AF_UNSPEC;

9 hints.ai_socktype = SOCK_DGRAM;

10 if ((n = getaddrinfo(host, serv, &hints, &res)) != 0)

11 err_quit("udp_client error for %s, %s: %s",

12 host, serv, gai_strerror(n));

13 ressave = res;

14 do {

15 sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);

16 if (sockfd >= 0)

17 break; /*
успех */

18 } while ((res = res->ai_next) != NULL);

19 if (res == NULL) /* значение errno устанавливается при последнем

вызове функции socket */

20 err_sys("udp_client error for %s, %s", host, serv);

21 *saptr = Malloc(res->ai_addrlen);

22 memcpy(*saptr, res->ai_addr, res->ai_addrlen);

23 *lenp = res->ai_addrlen;

24 freeaddrinfo(ressave);

25 return (sockfd);

26 }

Функция

getaddrinfo
преобразует аргументы
hostname
и
service
. Создается дейтаграммный сокет. Выделяется память для одной структуры адреса сокета, и структура адреса сокета, соответствующая созданному сокету, копируется в память.

Пример: не зависящий от протокола UDP-клиент времени и даты

Теперь мы перепишем наш клиент времени и даты, показанный в листинге 11.3, так, чтобы в нем использовалась наша функция

udp_client
. В листинге 11.10 представлен не зависящий от протокола исходный код.

Листинг 11.10. UDP-клиент времени и даты, использующий нашу функцию udp_client

//names/daytimeudpcli1.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int sockfd, n;

6 char recvline[MAXLINE + 1];

7 socklen_t salen;

8 struct sockaddr *sa;

9 if (argc != 3)

10 err_quit

11 ("usage; daytimeudpcli1 <hostname/IPaddress> <service/port#>");

12 sockfd = Udp_client(argv[1], argv[2], (void**)&sa, &salen);

13 printf("sending to %s\n", Sock_ntop_host(sa, salen));

14 Sendto(sockfd, "", 1, 0, sa, salen); /*
посылается 1-байтовая

дейтаграмма */

15 n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);

16 recvline[n] = 0; /* завершающий пустой байт */

17 Fputs(recvline, stdout);

18 exit(0);

19 }

12-17
Мы вызываем нашу функцию
udp_client
и затем выводим IP-адрес и порт сервера, которому мы отправим нашу дейтаграмму UDP. Мы посылаем однобайтовую дейтаграмму и затем читаем и выводим ответ сервера.

ПРИМЕЧАНИЕ

Нам достаточно отправить дейтаграмму, содержащую 0 байт, поскольку ответ сервера времени и даты инициируется самим получением дейтаграммы от клиента, независимо от ее длины и содержания. Но многие реализации SVR4 не допускают нулевой длины дейтаграмм UDP.

Мы запускаем наш клиент, задавая имя узла с записью типа AAAA и типа А. Поскольку функция

getaddrinfo
в первую очередь возвращает структуру с записью типа AAAA, создается сокет IPv6:

freebsd % daytimeudpcli1 aix daytime

sending to 3ffe:b80:1f8d:2:204:acff:fe17:bf38

Sun Jul 23:21:12 2003

Затем мы задаем адрес того же узла в точечно-десятичной записи, в результате чего создается сокет IPv4:

freebsd % daytimeudpcli1 192.168.42.2 daytime

sending to 192.168.42.2

Sun Jul 23:21:40 2003

11.15. Функция udp_connect

Наша функция

udp_connect
создает присоединенный сокет UDP.

#include "unp.h"

int udp_connect(const char * hostname, const char * service);

Возвращает; дескриптор присоединенного сокета в случае успешного выполнения, в случае ошибки ничего не возвращает

В случае присоединенного сокета UDP два последних аргумента, которые требовались в функции

udp_client
, больше не нужны. Вызывающий процесс может вызвать функцию
write
вместо
sendto
, таким образом нашей функции не нужно возвращать структуру адреса сокета и ее длину. В листинге 11.11 представлен исходный код.

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

Путь Шедара

Кораблев Родион
4. Другая сторона
Фантастика:
боевая фантастика
6.83
рейтинг книги
Путь Шедара

Метаморфозы Катрин

Ром Полина
Фантастика:
фэнтези
8.26
рейтинг книги
Метаморфозы Катрин

Охота на разведенку

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
6.76
рейтинг книги
Охота на разведенку

Я до сих пор не князь. Книга XVI

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

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

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

"Малыш"

Рам Янка
2. Девочка с придурью
Любовные романы:
современные любовные романы
эро литература
6.00
рейтинг книги
Малыш

Мастер Разума II

Кронос Александр
2. Мастер Разума
Фантастика:
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
Мастер Разума II

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

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

Счастливый торт Шарлотты

Гринерс Эва
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Счастливый торт Шарлотты

Назад в СССР: 1984

Гаусс Максим
1. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
4.80
рейтинг книги
Назад в СССР: 1984

Не грози Дубровскому! Том IX

Панарин Антон
9. РОС: Не грози Дубровскому!
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Не грози Дубровскому! Том IX

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального

Газлайтер. Том 2

Володин Григорий
2. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 2

Искушение генерала драконов

Лунёва Мария
2. Генералы драконов
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Искушение генерала драконов