죽은 TCP 연결을 감지하지 못하는 Socket.SendAsync 메서드에 문제가 있습니다. 내 클라이언트/서버 응용 프로그램에서 서버는 정기적 인 간격으로 연결된 클라이언트에게 하트 비트를 전송합니다.Socket.SendAsync가 죽은 TCP 연결을 감지하지 못합니다.
내가 겪고있는 문제는 클라이언트가 더 이상 클라이언트가 죽지는 않지만 SendAsync 메서드의 콜백이 "SocketError.Success"를 나타내며 Socket.Connected 속성이 true인데 클라이언트가 더 이상 " 살아 있는". 따라서 서버에 하트 비트 데이터가 제대로 전송되고 클라이언트가 여전히 살아있는 것처럼 보입니다.
매번이 문제가 발생합니다. 클라이언트 측 PC는 절전 모드 또는 최대 절전 모드로 설정되어 있습니다. 클라이언트가 VMWare 인스턴스에서 실행 중이고 해당 인스턴스가 일시 중단 된 경우. 클라이언트가 윈도우 작업 관리자에서 사망, 응용 프로그램을 종료 할 때 나는
internal void InternalSendAsync(ByteDataChunk chunk)
{
asyncSendArgs.SetBuffer(chunk.Buffer, 0, chunk.Offset);
asyncSendArgs.UserToken = chunk;
Socket.SendAsync(asyncSendArgs);
}
private void SendCompleted(object sender, SocketAsyncEventArgs args)
{
if (args.SocketError != SocketError.Success || !Socket.Connected)
{
InternalDisconnect(args.SocketError);
return;
}
// all is good & do some other stuff
}
누구 여기에 무슨 일이 일어나고 있는지 어떤 생각을 가지고 있으며, 등이 문제가 표시되지 않는 SendCompleted 방법에도 불구하고 소켓 오류를 반환하지 않는 이유 클라이언트는 오래 전에 죽었습니다 (이전에 여러 시간 동안 서버를 실행 시켰고 죽은 소켓이 감지되지 않았습니다)?
감사합니다,
톰 MSDN에서
오른쪽 - 이것은 일반적인 접근 방식입니다. 클라이언트가 초 안에 하트 비트에 응답하지 않은 경우 클라이언트가 죽었다 고 가정하고 연결을 끊습니다. –
caf
이 방법을 사용하는 것이 좋겠지 만, 호스트가 절전/최대 절전 모드로 전환 된 경우에도 항상 이후에 보내기 오류가 발생하여 동기 전송과 관련하여이 문제를 보지 못했습니다. – TJF