Чтение онлайн

на главную - закладки

Жанры

UNIX: разработка сетевых приложений
Шрифт:

Многие реализации после установления соединения округляют размер приемного буфера сокета в большую сторону, чтобы он было кратным MSS. Чтобы узнать размер приемного буфера сокета после установления соединения, можно исследовать пакеты с помощью программы типа

tcpdump
и посмотреть, каков размер объявленного окна TCP.

7.3. Разместите в памяти структуру

linger
по имени
ling
и проинициализируйте ее следующим образом:

str_cli(stdin, sockfd);

ling.l_onoff = 1;

ling.l_linger = 0;

Setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

exit(0);

Это

заставит TCP на стороне клиента прекратить работу путем отправки сегмента RST вместо нормального обмена четырьмя сегментами. Дочерний процесс сервера вызывает функцию
readline
, возвращает ошибку
ECONNRESET
и выводит следующее сообщение:

readline error: Connection reset by peer

Клиентский сокет не должен проходить через состояние ожидания TIME_WAIT, даже если клиент выполняет активное закрытие.

7.4. Первый клиент вызывает функции

setsockopt
,
bind
и
connect
. Но если второй клиент вызовет функцию
bind
между вызовами функций
bind
и
connect
первого клиента, возвращается ошибка
EADDRINUSE
. Но как только первый клиент установит соединение с собеседником, вызов функции
bind
второго клиента будет работать, поскольку сокет первого клиента уже присоединен. В случае возвращения ошибки
EADDRINUSE
второму клиенту следует вызывать
bind
несколько раз, а не останавливаться при появлении первой ошибки — это единственный способ справиться с данной ситуацией.

7.5. Запускаем программу на узле без поддержки многоадресной передачи (MacOS X 10.2.6).

macosx % sock -s 9999 & запускаем первый сервер с универсальным адресом

[1] 29697

macosx % sock -s 172.24.37.78 9999 пробуем второй сервер, но без -А

can't bind local address: Address already in use

macosx % sock -s -A 172.24.37.78 9999 & пробуем опять с -A: работает

[2] 29699

macosx % sock -s -A 127.0.0.1 9999 & третий сервер с -A; работает

[3] 29700

macosx % netstat -na | grep 9999

tcp4 0 0 127.0.0.1.9999 *.* LISTEN

tcp4 0 0 206.62.226.37.9999 *.* LISTEN

tcp4 0 0 *.9999 *.* LISTEN

7.6. Теперь попробуем проделать то же на узле с поддержкой многоадресной

передачи, но без поддержки параметра
SO_REUSEADDR
(Solaris 9).

solaris % sock -s -u 8888 & запускаем первый

[1] 24051

solaris % sock -s -u 8888

can't bind local address: Address already in use

solaris % sock -s -u -A 8888 & снова пробуем запустить второй с -A:

работает

solaris % netstat -na | grep 8888 мы видим дублированное связывание

*.8888 Idle

* 8888 Idle

В этой системе задавать параметр

SO_REUSEADDR
было необходимо только для второго связывания. Наконец, запускаем сценарий в MacOS X 10.2.6, где поддерживается как многоадресная передача, так и параметр
SO_REUSEPORT
. Сначала пробуем использовать
SO_REUSEADDR
для обоих серверов, но это не работает.

macosx % sock -u -s -A 7777 &

[1] 17610

macosx % sock -u -s -A 7777

can't bind local address: Address already in use

Тогда пробуем использовать параметр

SO_REUSEPORT
только для второго сервера. Это также не работает, так как полностью дублированное связывание требует включения данного параметра для всех сокетов, совместно использующих соединение.

macosx % sock -u -s 8888 &

[1] 17612

macosx % sock -u -s -T 8888

can't bind local address: Address already in use

Наконец, задаем параметр

SO_REUSEPORT
для обоих серверов, и этот вариант работает.

macosx % sock -u -s -Т 9999 &

[1] 17614

macosx % sock -u -s -T 9999 &

[2] 17615

macosx % netstat -na | grep 9999

udp4 0 0 *.9999 *.*

udp4 0 0 *.9999 *.*

7.7. Этот параметр (

– d
) не делает ничего, поскольку программа
ping
использует ICMP-сокет, а параметр сокета
SO_DEBUG
влияет только на TCP-сокеты. Описание параметра сокета
SO_DEBUG
всегда было довольно расплывчатым, наподобие «этот параметр допускает отладку на соответствующем уровне протокола», и единственный уровень протокола, где реализуется данный параметр — это TCP.

Поделиться:
Популярные книги

Дракон - не подарок

Суббота Светлана
2. Королевская академия Драко
Фантастика:
фэнтези
6.74
рейтинг книги
Дракон - не подарок

Бастард Императора. Том 8

Орлов Андрей Юрьевич
8. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 8

Чужая дочь

Зика Натаэль
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Чужая дочь

Эра Мангуста. Том 2

Третьяков Андрей
2. Рос: Мангуст
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Эра Мангуста. Том 2

Идеальный мир для Лекаря 14

Сапфир Олег
14. Лекарь
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 14

Один на миллион. Трилогия

Земляной Андрей Борисович
Один на миллион
Фантастика:
боевая фантастика
8.95
рейтинг книги
Один на миллион. Трилогия

Помещицы из будущего

Порохня Анна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Помещицы из будущего

Шлейф сандала

Лерн Анна
Фантастика:
фэнтези
6.00
рейтинг книги
Шлейф сандала

Черный маг императора 2

Герда Александр
2. Черный маг императора
Фантастика:
юмористическая фантастика
попаданцы
аниме
6.00
рейтинг книги
Черный маг императора 2

Император

Рави Ивар
7. Прометей
Фантастика:
фэнтези
7.11
рейтинг книги
Император

Бандит 2

Щепетнов Евгений Владимирович
2. Петр Синельников
Фантастика:
боевая фантастика
5.73
рейтинг книги
Бандит 2

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Князь Серединного мира

Земляной Андрей Борисович
4. Страж
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Князь Серединного мира

Чайлдфри

Тоцка Тала
Любовные романы:
современные любовные романы
6.51
рейтинг книги
Чайлдфри