Tcp-соединения зависают в состоянии CLOSE_WAIT - PullRequest
10 голосов
/ 16 декабря 2009

Клиент сначала закрывает сокет, когда данных с сервера не так много, отключение tcp-соединения в порядке, например:

FIN -->
   <-- ACK
   <-- FIN, ACK
ACK -->

Когда сервер занят отправкой данных:

FIN -->
    <-- ACK,PSH
RST -->

И соединение с сервером приходит в состояние CLOSE_WAIT и долго там висит.

В чем здесь проблема? Клиент или сервер? Это происходит на Redhat5 для локальных сокетов.

В этой статье рассказывается о том, почему отправляется "RST", но я не знаю, почему соединение с сервером зависло на CLOSE_WAIT, и не отправляю FIN out.

[РЕДАКТИРОВАТЬ] Я проигнорировал самую важную информацию, это происходит при эмуляции сети qemu slirp. Похоже, что это проблема с ошибкой slirp для работы с тесным соединением.

Ответы [ 3 ]

2 голосов
/ 16 декабря 2009

Это означает, что в потоке остались непрочитанные данные, что клиент еще не завершил чтение.

Вы можете отключить его с помощью опции SO_LINGER. Вот соответствующая документация для Linux (также см. Саму опцию, здесь ) и [вот соответствующая функция2] для Win32.

Это сторона сервера, которая остается открытой, поэтому на стороне сервера вы можете попробовать отключить SO_LINGER.

0 голосов
/ 07 января 2010

Это известный дефект для QEMU.

0 голосов
/ 17 декабря 2009

Это может означать, что сервер не закрыл сокет. Вы можете легко сказать это, используя "lsof", чтобы вывести список файловых дескрипторов, открытых этим процессом, который будет включать сокеты TCP. Исправление состоит в том, чтобы процесс всегда закрывал сокет после завершения (даже в случае ошибок и т. Д.)

...