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

на главную

Жанры

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

//adviо/recvfromflags.c

1 #include "unp.h"

2 #include <sys/param.h> /* макрос ALIGN для макроса CMSG_NXTHDR */

3 ssize_t

4 recvfrom_flags(int fd, void *ptr, size_t nbytes, int *flagsp,

5 SA *sa, socklen_t *salenptr, struct unp_in_pktinfo *pktp)

6 {

7 struct msghdr msg;

8 struct iovec iov[1];

9 ssize_t n;

10 #ifdef HAVE_MSGHDR_MSG_CONTROL

11 struct cmsghdr *cmptr;

12 union {

13 struct cmsghdr cm;

14 char control[CMSG_SPACE(sizeof(struct in_addr)) +

15 CMSG_SPACE(sizeof(struct unp_in_pktinfo))];

16 } control_un;

17 msg.msg_control = control_un.control;

18 msg.msg_controllen = sizeof(control_un.control);

19 msg.msg_flags = 0;

20 #else

21 bzero(&msg, sizeof(msg)); /*
обнуление msg_accrightslen = 0 */

22 #endif

23 msg.msg_name = sa;

24 msg.msg_namelen = *salenptr;

25 iov[0].iov_base = ptr;

26 iov[0].iov_len = nbytes;

27 msg.msg_iov = iov;

28 msg.msg_iovlen = 1;

29 if ((n = recvmsg(fd, &msg, *flagsp)) < 0)

30 return(n);

31 *salenptr = msg.msg_namelen; /* возвращение результатов */

32 if (pktp)

33 bzero(pktp, sizeof(struct unp_in_pktinfo)); /* 0.0.0.0. интерфейс = 0 */

Подключаемые файлы

1-2
Использование макроопределения
CMSG_NXTHDR
требует подключения заголовочного файла
<sys/param.h>
.

Аргументы функции

3-5
Аргументы функции аналогичны аргументам функции
recvfrom
за исключением того, что четвертый аргумент является указателем на целочисленный флаг (так что мы можем возвратить флаги, возвращаемые функцией
recvmsg
), а седьмой аргумент новый: это указатель на структуру
unp_in_pktinfo
, содержащую IPv4-адрес получателя пришедшей дейтаграммы и индекс интерфейса, на котором дейтаграмма была получена.

Различия реализаций

10-22
При работе со структурой
msghdr
и различными константами
MSG_ XXX
мы встречаемся со множеством различий в реализациях. Одним из вариантов обработки таких различий может быть использование имеющейся в языке С возможности условного подключения (директива
#ifdef
). Если реализация поддерживает элемент
msg_control
, то выделяется пространство для хранения значений, возвращаемых параметрами сокета
IP_RECVDSTADDR
и
IP_RECVIF
, и соответствующие элементы инициализируются.

Заполнение структуры msghdr и вызов функции recvmsg

23-33
Заполняется структура
msghdr
и вызывается функция
recvmsg
. Значения элементов
msg_namelen
и
msg_flags
должны быть переданы обратно вызывающему процессу. Они являются аргументами типа «значение-результат». Мы также инициализируем структуру вызывающего процесса
unp_in_pktinfo
, устанавливая IP-адрес 0.0.0.0 и индекс интерфейса 0.

В листинге 22.2 показана вторая часть нашей функции.

Листинг 22.2. Функция recvfrom_flags: возвращаемые флаги и адрес получателя

//advio/recvfromflags.c

34 #ifndef HAVE_MSGHDR_MSG_CONTROL

35 *flagsp = 0; /* возвращение результатов */

36 return(n);

37 #else

38 *flagsp = msg.msg_flags; /* возвращение результатов */

39 if (msg.msg_controllen < sizeof(struct cmsghdr) ||

40 (msg.msg_flags & MSG_CTRUNC) || pktp == NULL)

41 return(n);

42 for (cmptr = CMSG_FIRSTHDR(&msg); cmptr != NULL;

43 cmptr = CMSG_NXTHDR(&msg, cmptr)) {

44 #ifdef IP_RECVDSTADDR

45 if (cmptr->cmsg_level == IPPROTO_IP &&

46 cmptr->cmsg_type == IP_RECVDSTADDR) {

47 memcpy(&pktp->ipi_addr, CMSG_DATA(cmptr),

48 sizeof(struct in_addr));

49 continue;

50 }

51 #endif

52 #ifdef IP_RECVIF

53 if (cmptr->cmsg_level == IPPROTO_IP && cmptr->cmsg_type == IP_RECVIF) {

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

Курсант: Назад в СССР 10

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

Сумеречный Стрелок 2

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

Идеальный мир для Лекаря 6

Сапфир Олег
6. Лекарь
Фантастика:
фэнтези
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 6

Новик

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

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

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

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Идеальный мир для Лекаря 23

Сапфир Олег
23. Лекарь
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Идеальный мир для Лекаря 23

Кротовский, вы сдурели

Парсиев Дмитрий
4. РОС: Изнанка Империи
Фантастика:
попаданцы
альтернативная история
рпг
5.00
рейтинг книги
Кротовский, вы сдурели

Книга 5. Империя на марше

Тамбовский Сергей
5. Империя у края
Фантастика:
альтернативная история
5.00
рейтинг книги
Книга 5. Империя на марше

Книга пятая: Древний

Злобин Михаил
5. О чем молчат могилы
Фантастика:
фэнтези
городское фэнтези
мистика
7.68
рейтинг книги
Книга пятая: Древний

Идеальный мир для Лекаря 17

Сапфир Олег
17. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 17

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

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

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