UNIX: разработка сетевых приложений
UNIX: разработка сетевых приложений читать книгу онлайн
Новое издание книги, посвященной созданию веб-серверов, клиент-серверных приложений или любого другого сетевого программного обеспечения в операционной системе UNIX, — классическое руководство по сетевым программным интерфейсам, в частности сокетам. Оно основано на трудах Уильяма Стивенса и полностью переработано и обновлено двумя ведущими экспертами по сетевому программированию. В книгу включено описание ключевых современных стандартов, реализаций и методов, она содержит большое количество иллюстрирующих примеров и может использоваться как учебник по программированию в сетях, так и в качестве справочника для опытных программистов.
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
solaris % <b>grep 'Protocol not supported' /usr/include/sys/errno.h</b>
#define EPROTONOSUPPORT 120 /* Protocol not supported */
Это значение
errno
socket
solaris % <b>man socket</b>
В большинстве руководств пользователя в конце под заголовком «Errors» приводится дополнительная, хотя и лаконичная информация об ошибках.
1.4. Заменяем первое описание на следующее:
int sockfd, n, counter = 0;
Добавляем оператор
counter++;
в качестве первого оператора цикла
while
printf("counter = %dn", counter);
На экран всегда выводится значение 1.
1.5. Объявим переменную i типа int и заменим вызов функции
write
for (i = 0; i < strlen(buff); i++)
Write(connfd, &buff[i], 1);
Результат зависит от расположения клиентского узла и узла сервера. Если клиент и сервер находятся на одном узле, счетчик обычно равен 1. Это значит, что даже если сервер выполнит функцию
write
read
Цель этого примера — продемонстрировать, что разные реализации TCP по-разному поступают с данными, поэтому наше приложение должно быть готово считывать данные как поток байтов, пока не будет достигнут конец потока.
Глава 2
2.1 Зайдите на веб-страницу
http://www.iana.org/numbers.htm
2.2. Все RFC бесплатно доступны по электронной почте, через FTP или Web. Стартовая страница для поиска находится по адресу
http://www.ietf.org
ftp://ftp.isi.edu/in-notes
rfc-index.txt
http://www.rfc-editor.org/rfc-index.html
2.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_ANY
INADDR_NONE
INADDR_MAX_LOCAL_GROUP
0xe00000ff
4.2. Приведем новые строки, добавленные после вызова
connect
len = sizeof(cliaddr);
Getsockname(sockfd, (SA*)&cliaddr, &len);
printf("local addr: %sn",
Sock_ntop((SA*)&cliaddr, len));
Это требует описания переменной
len
socklen_t
cliaddr
struct sockaddr_in
getsockname(len)
4.3. Когда дочерний процесс вызывает функцию
close
close
4.4. Функция
accept
EINVAL
4.5. Вызов функции
listen
bind
Глава 5
5.1. Длительность состояния TIME_WAIT должна находиться в интервале между 1 и 4 минутами, что дает величину MSL от 30 с до 2 мин.