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

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

Жанры

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

44 }

45 exit(0);

46 }

11.5. Программа приведена в листинге Д.6.

Листинг Д.6. Модификация листинга 11.2 для работы с IPv4 и IPv6

//names/daytimetcpcli3.c

1 #include "unp.h"

2 int

3 main(int argc, char **argv)

4 {

5 int sockfd, n;

6 char recvline[MAXLINE + 1];

7 struct sockaddr_in servaddr;

8 struct sockaddr_in6 servaddr6;

9 struct sockaddr *sa;

10 socklen_t sal en;

11 struct in_addr **pptr;

12 struct hostent *hp;

13 struct servent *sp;

14 if (argc != 3)

15 err_quit("usage: daytimetcpcli3 <hostname> <service>");

16 if ((hp = gethostbyname(argv[1])) == NULL)

17 err_quit("hostname error for %s: %s", argv[1], hstrerror(h_errno));

18 if ((sp = getservbyname(argv[2], "tcp")) == NULL)

19 err_quit("getservbyname error for %s", argv[2]);

20 pptr = (struct in_addr**)hp->h_addr_list;

21 for (; *pptr != NULL; pptr++) {

22 sockfd = Socket(hp->h_addrtype, SOCK_STREAM, 0);

23 if (hp->h_addrtype == AF_INET) {

24 sa = (SA*)&servaddr;

25 salen = sizeof(servaddr);

26 } else if (hp->h_addrtype == AF_INET6) {

27 sa = (SA*)&servaddr6;

28 salen = sizeof(servaddr6);

29 } else

30 err_quit("unknown addrtype %d", hp->h_addrtype);

31 bzero(sa, salen);

32 sa->sa_family = hp->h_addrtype;

33 sock_set_port(sa, salen, sp->s_port);

34 sock_set_addr(sa, salen, *pptr);

35 printf("trying %s\n", Sock_ntop(sa, salen));

36 if (connect(sockfd, sa, salen) == 0)

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

38 err_ret("connect error");

39 close(sockfd);

40 }

41 if (*pptr == NULL)

42 err_quit("unable to connect");

43 while ((n = Read(sockfd, recvline, MAXLINE)) > 0) {

44 recvline[n] = 0; /* завершающий нуль */

45 Fputs(recvline, stdout);

46 }

47 exit(0);

48 }

Используем значение

h_addrtype
, возвращаемое функцией
gethostbyname
, для определения типа адреса. Также используем функции
sock_set_port
и
sock_set_addr
(см. раздел 3.8), чтобы установить два соответствующих поля в структуре адреса сокета.

Эта программа работает, однако имеется два ограничения. Во-первых, мы должны обрабатывать все различия, следя за

h_addrtype
и задавая соответствующим образом
sa
или
salen
. Более удачным решением было бы иметь библиотечную функцию, которая не только просматривает имя узла и имя службы, но и заполняет всю структуру адреса сокета (например,
getaddrinfo
, см. раздел 11.6). Во-вторых, эта программа компилируется только на узлах с поддержкой IPv6. Чтобы ее можно было откомпилировать на узле, поддерживающем только IPv4, следует добавить в код огромное количество директив
#ifdef
, что, несомненно, усложнит программу.

11.7. Разместите в памяти большой буфер (превышающий по размеру любую структуру адреса сокета) и вызовите функцию

getsockname
. Третий аргумент является аргументом типа «значение-результат», возвращающим фактический размер адресов протоколов. К сожалению, это допускают только структуры адреса сокета с фиксированной длиной (IPv4 и IPv6). Нет гарантии, что этот буфер будет работать с протоколами, которые могут вернуть структуру адреса сокета переменной длины (доменные сокеты Unix, см. главу 15).

11.8. Сначала размещаем в памяти массивы, содержащие имя узла и имя службы:

char host[NI_MAXHOST], serv[NI_MAXSERV];

После того как функция

accept
возвращает управление, вызываем вместо функции
sock_ntop
функцию
getnameinfo
:

if (getnameinfo(cliaddr, len, host, NI_MAXHOST, serv, NI_MAXSERV,

NI_NUMERICHOST | NI_NUMERICSERV) == 0)

printf("connection from %s.%s\n", host, serv);

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

Адвокат Империи 3

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

Кротовский, может, хватит?

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

Дурная жена неверного дракона

Ганова Алиса
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Дурная жена неверного дракона

Вонгозеро

Вагнер Яна
1. Вонгозеро
Детективы:
триллеры
9.19
рейтинг книги
Вонгозеро

Ведьма Вильхельма

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
8.67
рейтинг книги
Ведьма Вильхельма

Папина дочка

Рам Янка
4. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Папина дочка

Законы Рода. Том 6

Flow Ascold
6. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Законы Рода. Том 6

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

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

Лучший из худший 3

Дашко Дмитрий
3. Лучший из худших
Фантастика:
городское фэнтези
попаданцы
аниме
6.00
рейтинг книги
Лучший из худший 3

Штурмовик из будущего 3

Политов Дмитрий Валерьевич
3. Небо в огне
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Штурмовик из будущего 3

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

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

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

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

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Вдова на выданье

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Вдова на выданье