Читаем UNIX: разработка сетевых приложений полностью

5.2. Наши клиент-серверные программы не работают с двоичными файлами. Допустим, что первые 3 байта в файле являются двоичной единицей (1), двоичным нулем (0) и символом новой строки. При вызове функции fgets в листинге 5.4 либо считывается MAXLINE - 1 символов, либо считываются символы до символа новой строки или до конца файла. В данном примере функция считает три символа, а затем прервет строку нулевым байтом. Но вызов функции strlen в листинге 5.4 возвращает значение 1, так как она остановится на первом нулевом байте. Один байт посылается серверу, но сервер блокируется в своем вызове функции readline, ожидая символа новой строки. Клиент блокируется, ожидая ответа от сервера. Такое состояние называется зависанием, или взаимной блокировкой: оба процесса блокированы и при этом каждый ждет от другого некоторого действия, которое никогда не произойдет. Проблема заключается в том, что функция fgets обозначает нулевым байтом конец возвращаемых ею данных, поэтому данные, которые она считывает, не должны содержать нулевой байт.

5.3. Программа Telnet преобразует входные строки в NVT ASCII (см. раздел 26.4 книги [111]), что означает прерывание каждой строки 2-символьной последовательностью CR (carriage return — возврат каретки) и LF (linefeed — новая строка). Наш клиент добавляет только разделитель строк (newline), который в действительности является символом новой строки (linefeed, LF). Тем не менее можно использовать клиент Telnet для связи с нашим сервером, поскольку наш сервер отражает каждый символ, включая CR, предшествующий каждому разделителю строк.

5.4. Нет, последние два сегмента из последовательности завершения соединения не посылаются. Когда клиент посылает серверу данные после уничтожения дочернего процесса сервера (ввод строки another line, см. раздел 5.12), сервер TCP отвечает сегментом RST. Сегмент RST прекращает соединение, а также предотвращает переход в состояние TIME_WAIT на стороне сервера (конец соединения, осуществивший активное закрытие).

5.5. Ничего не меняется, потому что процесс, запущенный на узле сервера, создает прослушиваемый сокет и ждет прибытия запросов на соединение. На третьем шаге мы посылаем сегмент данных, предназначенный для установленного соединения TCP (состояние ESTABLISHED). Наш сервер с прослушиваемым сокетом не увидит этот сегмент данных, и TCP сервера по-прежнему будет посылать клиенту сегмент RST.

5.6. В листинге Д.1[1] приведена программа. Запуск этой программы в Soalris генерирует следующий вывод:

solaris % tsigpipe 192.168.1.10

SIGPIPE received

write error: Broken pipe

Начальный вызов функции sleep и переход в режим ожидания на 2 с нужен, чтобы сервер времени и даты отправил ответ и закрыл свой конец соединения. Первая функция write отправляет сегмент данных серверу, который отвечает сегментом RST (поскольку сервер времени и даты полностью закрыл свой сокет). Обратите внимание, что наш TCP позволяет писать в сокет, получивший сегмент FIN. Второй вызов функции sleep позволяет получить от сервера сегмент RST, а во втором вызове функции write генерируется сигнал SIGPIPE. Поскольку наш обработчик сигналов возвращает управление, функция write возвращает ошибку EPIPE.

Листинг Д.1. Генерация SIGPIPE

//tcpcliserv/tsigpipe.c

 1 #include "unp.h"


 2 void

 3 sig_pipe(int signo)

 4 {

 5  printf("SIGPIPE received\n");

 6  return;

 7 }


 8 int

 9 main(int argc, char **argv)

10 {

11  int sockfd;

12  struct sockaddr_in servaddr;


13  if (argc != 2)

14   err_quit("usage: tcpcli ");


15  sockfd = Socket(AF_INET, SOCK_STREAM, 0);


16  bzero(&servaddr, sizeof(servaddr));

17  servaddr.sin_family = AF_INET;

18  servaddr.sin_port = htons(13); /* сервер времени и даты */

19  Inet_pton(AF_INET, argv[1], &servaddr.sin_addr);


20  Signal(SIGPIPE, sig_pipe);


21  Connect(sockfd, (SA*)&servaddr, sizeof(servaddr));


22  sleep(2);

23  Write(sockfd, "hello", 5);

24  sleep(2);

25  Write(sockfd, "world", 5);


26  exit(0);

27 }

Перейти на страницу:

Все книги серии Мастер-класс

Секреты резьбы по дереву
Секреты резьбы по дереву

Изделия из древесины и материалов, имитирующих ее текстуру, привычным образом окружают нас в повседневной жизни, поэтому мы относимся к ней как к чему-то обыденному. Но как только ее коснется умелая рука мастера резьбы по дереву, рождается произведение искусства и раскрываются такие качества древесины, как богатая фактура, разнообразие цветов, особая теплота. Эта книга поможет читателю открыть для себя удивительный мир творчества и познать секреты резьбы по дереву. Автор надеется, что начинающие резчики найдут в ней интересный и полезный материал, который позволит им стать мастерами. В приложении представлены рисунки орнаментов и различных узоров, которые на первых порах можно копировать, а по мере приобретения навыка на их основе разрабатывать свои образцы.

Галина Алексеевна Серикова

Сделай сам / Хобби и ремесла / Руководства / Дом и досуг / Словари и Энциклопедии

Похожие книги

Как раскрутить и разрекламировать Web-сайт в сети Интернет
Как раскрутить и разрекламировать Web-сайт в сети Интернет

Настоящая книга заинтересует всех, кто столкнулся с вопросами подготовки, размещения в Сети и популяризации Internet ресурсов различного уровня: от домашней странички до корпоративного сайта. В ней вы найдете все, что необходимо для оптимизации Web сайтов под поисковые системы: приемы написания Web-страниц, описание множества самых популярных специализированных программ, предназначенных для подготовки сайта и его раскрутки, создания удачного HTML-кода страниц с правильными метаданными.Книга является практическим руководством для разработчиков Web сайтов и всех, занимающихся их продвижением. Автор приводит множество советов, касающихся создания и анонсирования Web страниц. Рассмотрены средства автоматизации для повышения эффективности разработки и маркетинга при создании и обслуживании сайта. Описание программных и сетевых средств, автоматизирующих процессы тестирования и отладки сайта, обеспечивающих проверку работоспособности и корректности гиперссылок, синтаксиса HTML кода и грамматики размещенного на странице текста, занимает центральное место в книге. Подробно излагаются возможности таких программ, как Linkbot Developer Edition, Domain NameChecker, Retrieve, CyberSpyder Link Test, HTML Link Validator, CSE HTML Validator, A Real Validator, MetaTag ToolKit, MetaMan, WebQA.Отдельная глава посвящена регистрации Web ресурсов в поисковых системах и каталогах. Описываются программы автоматической регистрации (WebPosition, Page Promoter, Web Регистратор), способы взаимодействия с индексирующими роботами поисковых машин, правила применения метаданных. Рассматриваются приемы и методы рекламы сайтов в Internet, указаны критерии ее эффективности.Издание рассчитано на широкий круг читателей и будет полезно как начинающим создателям Web сайтов, так и профессионалам, которые хотят научиться более качественно продвигать в Сети свой Web продукт.

Александр Петрович Загуменнов

ОС и Сети, интернет