Вход/Регистрация
UNIX: разработка сетевых приложений
вернуться

Стивенс Уильям Ричард

Шрифт:
Завершение программы

26
Функция
exit
завершает программу. Unix всегда закрывает все открытые дескрипторы при завершении процесса, поэтому теперь наш сокет TCP закрыт.

Как уже говорилось, пока мы лишь выделили наиболее важные моменты, детальным исследованием которых займемся в дальнейшем.

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_in6servaddr;

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.4. Обработка ошибок: функции-обертки

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

socket
,
inet_pton
,
connect
,
read
и
fputs
, и когда ошибка случается, мы вызываем свои собственные функции
err_quit
и
err_sys
для печати сообщения об ошибке и для прерывания выполнения программы. В отдельных случаях, когда функция возвращает ошибку, бывает нужно сделать еще что-либо помимо прерывания программы, как показано в листинге 5.9, когда мы должны проверить прерванный системный вызов.

Поскольку прерывание программы из-за ошибки — типичное явление, мы сократим наши программы, определив функции-обертки, которые будут вызывать соответствующие рабочие функции, проверять возвращаемые значения и прерывать программу при возникновении ошибки. Соглашение, используемое нами, заключается в том, что название функции-обертки пишется с заглавной буквы, например:

sockfd = Socket(AF_INET, SOCK_STREAM, 0);

Наша функция-обертка для функции socket показана в листинге 1.3.

  • Читать дальше
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

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