O cliente não está recebendo um ACK do servidor para o FIN enviado para o servidor. Eu recomendaria colocar uma captura de pacotes no cliente e no servidor para ver o que está acontecendo.
Eu tenho um aplicativo de servidor cliente em execução em: Servidor: servidor Windows 2008 R2 [padrão] Cliente: Windows XP SP3
Fluxo de trabalho: O servidor escuta as conexões do cliente na porta YY. Cliente se conecta ao servidor na porta YY. Os dados são transferidos do servidor para o cliente. Servidor fecha o soquete (com opção de reutilização, TF_REUSE_SOCKET) Cliente fecha o soquete.
Problema: Em cenários normais, quando a transferência de dados é concluída, o servidor fecha o soquete e tudo funciona bem. Mas nos cenários em que o Cliente fecha o soquete primeiro (para cancelar a transferência de dados), o estado do soquete @ server é alterado para CLOSED_WAIT (como o servidor recebe FIN do cliente). No lado do cliente, o estado do soquete em FIN_WAIT_2. Este estado de soquete permanece para sempre. Os soquetes não são liberados.
O mesmo aplicativo funciona bem se o servidor também for o Windows XP XP3.
Existe alguma configuração no Windows2008 R2 que faz com que meu aplicativo não libere o soquete (ou altere o estado do soquete de CLOSED_WAIT)?
Nota: Eu configurei [HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ services \ Tcpip \ Parameters] TcpFinWait2Delay = 60 Mas sem utilidade.
O cliente não está recebendo um ACK do servidor para o FIN enviado para o servidor. Eu recomendaria colocar uma captura de pacotes no cliente e no servidor para ver o que está acontecendo.
O código do servidor está quebrado. Ele não está chamando CloseSocket
(ou o equivalente na API que você está usando) e, portanto, seu identificador para a conexão nunca é fechado.