Книга: UNIX: разработка сетевых приложений
1.3. Независимость от протокола
1.3. Независимость от протокола
Наша программа, представленная в листинге 1.1, является зависимой от протокола (protocol dependent) IPv4. Мы выделяем и инициализируем структуру sockaddr_in
, определяем адрес как относящийся к семейству AF_INET и устанавливаем первый аргумент функции socket
равным AF_INET
.
Если мы хотим изменить программу так, чтобы она работала по протоколу IPv6, мы должны изменить код. В листинге 1.2 показана новая версия программы с соответствующими изменениями, отмеченными полужирным шрифтом.
Листинг 1.2. Версия листинга 1.1 для IPv6
//intro/daytimetcpcliv6.с
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_in6 servaddr;
8 if (argc != 2)
9 err_quit("usage: a.out <Ipaddress>");
10 if ((sockfd = socket(AF_INET6, SOCK_STREAM, 0)) < 0)
11 err_sys("socket error");
12 bzero(&servaddr, sizeof(servaddr));
13 servaddr.sin6_family = AF_INET6;
14 servaddr.sin6_port = htons(13); /* сервер времени и даты */
15 if (inet_pton(AF_INET6, argv[1], &servaddr.sin6_addr) <= 0)
16 err_quit("inet_pton error for %s", argv[1]);
17 if (connect(sockfd, (SA*)&servaddr, sizeof(servaddr)) < 0)
18 err_sys("connect error");
19 while ((n = read(sockfd, recvline, MAXLINE)) > 0) {
20 recvline[n] = 0; /* символ конца строки */
21 if (fputs(recvline, stdout) == EOF)
22 err_sys("fputs error");
23 }
24 if (n < 0)
25 err_sys("read error");
26 exit(0);
27 }
Изменились только пять строк, но в результате мы все равно получили программу, зависимую от протокола, в данном случае — от протокола IPv6. Лучше сделать программу независимой от протокола (protocol independent). В листинге 11.3 представлена независимая от протокола версия этого клиента, основанная на вызове getaddrinfo
из tcp_connect
.
Другим недостатком наших программ является то, что пользователь должен вводить IP-адрес сервера в точечно-десятичной записи (например, 206.168.112.219 для версии IPv4). Людям проще работать с именами, чем с числами (например, www.unpbook.com
). В главе 11 мы обсудим функции, обеспечивающие преобразование имен узлов в IP-адреса и имен служб в порты. Мы специально откладываем описание этих функций, продолжая использовать IP-адреса и номера портов, чтобы иметь ясное представление о том, что именно входит в структуры адресов сокетов, которые мы должны заполнить и проверить. Это также упрощает наши объяснения сетевого программирования, снимая необходимость описывать в подробностях еще один набор функций.
- 1.1. Введение
- 1.2. Простой клиент времени и даты
- 1.3. Независимость от протокола
- 1.4. Обработка ошибок: функции-обертки
- 1.5. Простой сервер времени и даты
- 1.6. Таблица соответствия примеров технологии клиент-сервер
- 1.7. Модель OSI
- 1.8. История сетевого обеспечения BSD
- 1.9. Сети и узлы, используемые в примерах
- 1.10. Стандарты Unix
- 1.11. 64-разрядные архитектуры
- 1.12. Резюме
- Упражнения
- Приложение 1 Команды FTP-протокола
- 10.1. Работа FTP-протокола
- 10.1.1. Команды FTP-протокола
- Листинг 10.1. Пример работы протокола FTP
- 8.12.3 Механизм протокола IGRP
- Выбор протокола
- Принцип работы протокола NNTP
- Передача данных с помощью протокола SMTP
- Формат файла протокола Apache
- 15.6. Клиент и сервер дейтаграммного доменного протокола Unix
- 6.13 Механизмы протокола IP
- 24.2. Внеполосные данные протокола TCP