UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
8.2. Если протокол использует структуры адреса сокета переменной длины,
clilensendtorecvfrom8.4. Запуск программы
pingsolarispingaix % <b>ping -v -I 60 127.0.0.1</b>PING 127.0.0.1: {127.0.0.1}: 56 data bytes64 bytes from 127 0.0.1: icmp_seq=0 ttl=255 time=0 ms36 bytes from 192.168.42.1: Destination Port UnreachableVr HL TOS Len ID Fig Off TTL Pro cks Src Dst Data4 5 00 0022 0007 0 0000 1e 11 c770 192 168 42.2 192.168.42.1UDP: from port 40645. to port 9877 (decimal)He все версии ping выводят сообщения об ICMP-ошибках, даже если задан параметр -v.
8.5. Прослушиваемый сокет может иметь приемный буфер определенного размера, но прослушиваемым TCP-сокетом данные никогда не принимаются. Большинство реализаций не выделяют заранее память под буферы отправки и приема. Размеры буферов сокета, определяемые параметрами
SO_SNDBUFSO_RCVBUF8.6. Запустим программу
sock-u-lfreebsdfreebsd % <b>sock -u -l 12.106.32.254.4444 192.168.42.2 8888</b><b>hello</b>Локальный IP-адрес подключен к Интернету (см. рис. 1.7), но чтобы достичь получателя, дейтаграмма должна выйти через другой интерфейс. Наблюдая за сетью с помощью программы
tcpdump14:28:29.614846 12.106.32.254.444 > 192.168.42.2.8888. udp 614:28:29.615255 192.168.42.2 > 12 106.32.254: icmp: 192.168 42.2udp port 8888 unreachable8.7. Использование функции
printfprintf8.8. Наибольший размер IPv4-дейтаграммы составляет 65 535 байт и ограничивается 16-разрядным полем полной длины, показанным на рис. А.1. IP-заголовок требует 20 байт, UDP-заголовок — 8 байт, и для пользовательских данных остается не более 65 507 байт. В IPv6 (без поддержки джумбограмм) размер IP-заголовка составляет 40 байт, и под пользовательские данные отводится 65 487 байт.
В листинге Д.3 приведена новая версия
dg_clisendtoEMSGSIZEЛистинг Д.3. Запись дейтаграммы UDP/IPv4 максимального размера
//udpcliserv/dgclibig.c 1 #include "unp.h" 2 #undef MAXLINE 3 #define MAXLINE 65507 4 void 5 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen) 6 { 7 int size; 8 char sendline[MAXLINE], recvline[MAXLINE + 1]; 9 ssize_t n;10 size = 70000;11 Setsockopt(sockfd, SOL_SOCKET, SO_SNDBUF, &size, sizeof(size));12 Setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &size, sizeof(size));13 Sendto(sockfd, sendline, MAXLINE, 0, pservaddr, servlen);14 n = Recvfrom(sockfd, recvline, MAXLINE, 0, NULL, NULL);15 printf("received %d bytesn", n);16 }Но если установить размеры буферов сокета клиента, как показано в листинге Д.3, и запустить программу, сервер ничего не возвратит. С помощью программы
tcpdumpprintfrecvfromnetstat -sdropped due to full socket buffersВ большинстве сетей дейтаграмма длиной 65 535 байт фрагментируется. Как отмечалось в разделе 2.9, IP-уровнем должен поддерживаться размер буфера для сборки фрагментов, равный всего лишь 576 байт. Поэтому некоторые узлы не получат дейтаграмму максимального размера, посылаемую в данном упражнении. Кроме того, во многих Беркли-реализациях, включая 4.4BSD-Lite2, имеется ошибка, связанная со знаковыми типами данных, которая не позволяет UDP принимать дейтаграммы больше, чем 32 767 байт (см. строка 95, с. 770 [128]).
Глава 9
9.1. В некоторых ситуациях функция
sctp_peeloff
