LINUX.ORG.RU

TCP, Разрыв соединения


0

1

Добрый день. Есть TCP сервер и клиент к нему. В некоторый момент времени на сервере происходит ошибка и он закрывает соединение (не FIN, RST).

tcpdump показывает этот сегмент

10:34:13.117808 IP server.5672 > client.51471: R 250804528:250804528(0) ack 1 win 1086 <nop,nop,timestamp 1149294855 2590309211>

Но клиент, который опрашивает этот сокет в poll (POLLIN) исправно получает 0, т.е. таймаут - готовых сокетов нет. Клиент только читает данные.

Так вот в чем может быть причина такого странного поведения? Почему клиент «не видит» сегмент RST?

Ответ на: комментарий от Jetty

Хочешь сказать, что я могу ошибаться, что сегмент RST (тот что я вижу в tcpdump) свидетельствует именно о закрытии этого соединения?

placement_new ★★
() автор топика

А RST разве должен свалиться в сокет клиенту, если кроме этого флага никаких данных в сегменте нет?

anonymous
()
Ответ на: комментарий от pathfinder

Его нельзя слушать. Если это случится сокет должен быть готовым для чтения в любом случае.

placement_new ★★
() автор топика

RDHUP блджад!

может, что-то связанное с shutdown() ?

и таки да, поставь-ка слушаться еще и POLLRDHUP - у меня как раз такая штука с epoll была - правда с EPOLLET. т.е. EPOLLIN не срабатывал (так как я еще не наткнулся на EWOULDBLOCK) а EPOLLRDHUP сработал.

По ходу при обрыве соединения IN-событие генерит только select....

mmarkk
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.