UNIX: разработка сетевых приложений, стр. 386
solaris % <b>sock -s -u 8888 &</b> <i>запускаем первый</i>
[1] 24051
solaris % <b>sock -s -u 8888</b>
can't bind local address: Address already in use
solaris % <b>sock -s -u -A 8888 &</b> <i>снова пробуем запустить второй с -A:</i>
<i> работает</i>
solaris % <b>netstat -na | grep 8888</b> <i>мы видим дублированное связывание</i>
*.8888 Idle
* 8888 Idle
В этой системе задавать параметр
SO_REUSEADDR
SO_REUSEPORT
SO_REUSEADDR
macosx % <b>sock -u -s -A 7777 &</b>
[1] 17610
macosx % <b>sock -u -s -A 7777</b>
can't bind local address: Address already in use
Тогда пробуем использовать параметр
SO_REUSEPORT
macosx % <b>sock -u -s 8888 &</b>
[1] 17612
macosx % <b>sock -u -s -T 8888</b>
can't bind local address: Address already in use
Наконец, задаем параметр
SO_REUSEPORT
macosx % <b>sock -u -s -Т 9999 &</b>
[1] 17614
macosx % <b>sock -u -s -T 9999 &</b>
[2] 17615
macosx % <b>netstat -na | grep 9999</b>
udp4 0 0 *.9999 *.*
udp4 0 0 *.9999 *.*
7.7. Этот параметр (
-d
ping
SO_DEBUG
SO_DEBUG
7.8. Временная диаграмма приведена на рис. Д.4.

Рис. Д.4. Взаимодействие алгоритма Нагла с задержанными сегментами ACK
7.9. Установка параметра сокета
TCP_NODELAY
write

Рис Д.5. Предотвращение алгоритма Нагла путем установки параметра TCP_NODELAY
7.10. Как показано на рис. Д.6, преимущество данного решения состоит в уменьшении числа пакетов.

Рис. Д.6. Использование функции writev вместо параметра сокета TCP_NODELAY
7.11. В разделе 4.2.3.2 говорится: «задержка ДОЛЖНА быть меньше 0,5 с, а в потоке полноразмерных сегментов СЛЕДУЕТ использовать сегмент ACK по крайней мере для каждого второго сегмента». Беркли-реализации задерживают сегмент ACK не более, чем на 200 мс [128, с. 821].
7.12. Родительский процесс сервера в листинге 5.1 большую часть времени блокирован в вызове функции
accept
read
readline
SO_KEEPALIVE
ETIMEDOUT
7.13. Клиент, приведенный в листинге 5.4, большую часть времени блокирован вызовом функции
fgets
ETIMEDOUT
fgets
select
7.14. Этот клиент большую часть времени блокирован вызовом функции
select
ETIMEDOUT
7.15. Происходит обмен только двумя сегментами, а не четырьмя. Вероятность того, что таймеры двух систем будут строго синхронизированы, очень мала, следовательно, на одном конце соединения таймер проверки работоспособности сработает немного раньше, чем на другом. Первый из сработавших таймеров посылает проверочное сообщение, заставляя другой конец послать в ответ сегмент ACK. Но получение проверочного сообщения приводит к тому, что таймеру проверки работоспособности с более медленными часами будет присвоено новое значение — он сдвинется на 2 ч вперед.
7.16 Изначально в API сокетов не было функции
listen
socket
SO_ACCEPTCONN
listen
Глава 8
8.1. Да. Функция
read
recvfrom
recvfrom