Вопрос

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

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

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

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

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

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

Этот статья поговорим о том, почему отправляется «RST», но я не знаю, почему соединение с сервером зависло на CLOSE_WAIT и не отправляет FIN.

[EDIT] Я проигнорировал самую важную информацию, это происходит при эмуляции сети qemu slirp.Кажется, это проблема с ошибкой при работе с тесным соединением.

Это было полезно?

Решение 3

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

Другие советы

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top