UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
solaris % <b>grep 'Protocol not supported' /usr/include/sys/errno.h</b>#define EPROTONOSUPPORT 120 /* Protocol not supported */Это значение
errnosocketsolaris % <b>man socket</b>В большинстве руководств пользователя в конце под заголовком «Errors» приводится дополнительная, хотя и лаконичная информация об ошибках.
1.4. Заменяем первое описание на следующее:
int sockfd, n, counter = 0;Добавляем оператор
counter++;в качестве первого оператора цикла
whileprintf("counter = %dn", counter);На экран всегда выводится значение 1.
1.5. Объявим переменную i типа int и заменим вызов функции
writefor (i = 0; i < strlen(buff); i++) Write(connfd, &buff[i], 1);Результат зависит от расположения клиентского узла и узла сервера. Если клиент и сервер находятся на одном узле, счетчик обычно равен 1. Это значит, что даже если сервер выполнит функцию
writereadЦель этого примера — продемонстрировать, что разные реализации TCP по-разному поступают с данными, поэтому наше приложение должно быть готово считывать данные как поток байтов, пока не будет достигнут конец потока.
Глава 2
2.1 Зайдите на веб-страницу
http://www.iana.org/numbers.htm2.2. Все RFC бесплатно доступны по электронной почте, через FTP или Web. Стартовая страница для поиска находится по адресу
http://www.ietf.orgftp://ftp.isi.edu/in-notesrfc-index.txthttp://www.rfc-editor.org/rfc-index.html2.3. В версии IPv4 при таком значении MSS генерируется 576-байтовая дейтаграмма (20 байт для заголовка IPv4 и 20 байт для заголовка TCP). Это минимальный размер буфера для сборки фрагментов в Ipv4.
2.4. В данном примере сервер (а не клиент) осуществляет активное закрытие.
2.5. Узел в сети Token Ring не может посылать пакет, содержащий больше, чем 1460 байт данных, поскольку полученное им значение MSS равно 1460. Узел в сети Ethernet может посылать пакет размером до 4096 байт данных, но не превышающий величину MTU исходящего интерфейса (Ethernet) во избежание фрагментации. Протокол TCP не может превысить величину MSS, объявленную другой стороной, но он всегда может посылать пакеты меньшего размера.
2.6. В разделе «Protocol Numbers» (номера протоколов) RFC «Assigned Numbers» («Присвоенные номера») указано значение 89 для протокола OSPF.
2.7. Выборочное уведомление указывает лишь на получение пакетов с конкретными последовательными номерами. Кумулятивное уведомление сообщает о получении данных вплоть до конкретного порядкового номера (включительно). При освобождении буфера отправки в соответствии с выборочным уведомлением система может удалять только те данные, доставка которых была подтверждена явно, но не те, номера которых меньше или больше подтвержденных.
Глава 3
3.1. В языке С функция не может изменить значение аргумента, передаваемого по значению. Чтобы вызванная функция изменила значение, передаваемое вызывающим процессом, требуется, чтобы вызывающий процесс передал указатель на значение, подлежащее изменению.
3.2. Указатель должен увеличиваться на количество считанных или записанных байтов, но в языке С нет возможности увеличивать указатели типа
voidГлава 4
4.1. Посмотрите на определение констант, начинающихся с
INADDR_INADDR_ANYINADDR_NONEINADDR_MAX_LOCAL_GROUP0xe00000ff4.2. Приведем новые строки, добавленные после вызова
connectlen = sizeof(cliaddr);Getsockname(sockfd, (SA*)&cliaddr, &len);printf("local addr: %sn",Sock_ntop((SA*)&cliaddr, len));Это требует описания переменной
lensocklen_tcliaddrstruct sockaddr_ingetsockname(len)4.3. Когда дочерний процесс вызывает функцию
closeclose4.4. Функция
acceptEINVAL4.5. Вызов функции
listenbindГлава 5
5.1. Длительность состояния TIME_WAIT должна находиться в интервале между 1 и 4 минутами, что дает величину MSL от 30 с до 2 мин.
