У меня запущено клиент-серверное приложение: Сервер: Windows server 2008 R2 [Standard] Клиент: Windows XP SP3
Рабочий процесс: сервер прослушивает клиентские подключения через порт YY. Клиент подключается к серверу через порт YY. Данные передаются от сервера к клиенту. Сервер закрывает сокет (с опцией повторного использования TF_REUSE_SOCKET). Клиент закрывает сокет.
Проблема: в обычных сценариях, когда передача данных завершена, сервер закрывает сокет, и все работает нормально. Но в сценариях, когда Клиент сначала закрывает сокет (для отмены передачи данных), состояние сокета @ server изменяется на CLOSED_WAIT (поскольку сервер получает FIN от клиента). На стороне клиента состояние сокета в FIN_WAIT_2. Это состояние сокета остается навсегда. Розетки вообще не выпускаются.
Это же приложение отлично работает, если сервер также работает под управлением WindowsXP XP3.
Существуют ли какие-либо настройки в Windows2008 R2, которые заставляют мое приложение не освобождать сокет (или изменять состояние сокета с CLOSED_WAIT)?
Примечание: я настроил [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Parameters] TcpFinWait2Delay = 60 Но бесполезно.
Клиент не получает ACH от сервера для FIN, отправленного на сервер. Я бы рекомендовал установить захват пакетов на клиенте и на сервере, чтобы увидеть, что происходит.
Код сервера не работает. Это не звонит CloseSocket
(или эквивалент в используемом вами API), поэтому его дескриптор соединения никогда не закрывается.