여기에 일부 게시물을 기반으로 소켓 KeepAlive를 설정하기위한 다음과 같은 간단한 방법을 작성했으며 작동하는 것 같습니다. 두 서비스 간의 연결을 끊기 위해 이더넷 케이블을 뽑은 후 네트워크 라이브러리가 SocketAsyncEventArgs Completed 이벤트에서 전송 된 0 바이트를 처리하고 Disconnected 이벤트를 발생시킵니다.소켓 KeepAlive 단위
하지만 몇 가지 이유로 밀리 초 대신 1/100 초를 사용해야합니다. 이 문서에서 찾을 수있는 모든 문서는 밀리 초를 사용해야 함을 나타냅니다.
(편집) 내가 지금 바이트가 이러한 다른 두 가지 방법으로 경기를 반환 것을 확인했다 :
http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values
(편집) 나는 또한이 WireSharked 한과 킵 얼라이브 확인할 수 있습니다 간격이 500으로 설정되면 매 5 초마다 나가는 것입니다.
무엇이 제공됩니까? .NET의 최신 버전에서 무언가가 깨졌습니까?
private static byte[] GetKeepAliveOption(bool isEnabled, int keepAliveTime, int keepAliveInterval)
{
//time and interval are in hundredths of a second to work properly
//12 keepalive bytes, 1st 4 for enabled, next 4 for time, next 4 for interval
byte[] bytes = new byte[12];
if (isEnabled)
{
bytes[0] = 1;
}
byte[] keepAliveTimeBytes = BitConverter.GetBytes(KeepAliveTime);
Buffer.BlockCopy(keepAliveTimeBytes, 0, bytes, 4, 4);
byte[] keepAliveIntervalBytes = BitConverter.GetBytes(KeepAliveInterval);
Buffer.BlockCopy(keepAliveIntervalBytes, 0, bytes, 8, 4);
return bytes;
}
귀하의 기능은 두 가지 일을합니다. 관련 코드 만 표시하십시오. 'tcp_keepalive struct creation code "(모든 것은'socket.IOControl()'호출을 제외하고)를 byte []를 반환하는 세 개의 인자 ('enabled','time','interval')를 가진 별도의 메소드로 추출합니다. '를 사용하고 필요한 값에 대한 예상 및 실제 출력을 표시합니다. 이렇게하면 IOControl에 전달하기 전에 포함 할 것으로 예상되는 내용이 바이트에 포함되어 있는지 테스트하고 확인할 수 있습니다. – CodeCaster
CodeCaster 주석 주셔서 감사합니다. 미안하지만, 실제로 메소드를 단순화하려고했지만 좋은 프로그래밍 방법을 사용하고 유닛 테스트를하는 것이 결코 아프지는 않습니다.) 메소드를 약간 변경하고 내가 수행 한 테스트를 반영하도록 포스트를 편집했습니다. 내 결론은? KeepAlive에는 밀리 초가 아닌 1/100 초가 필요합니다. –
값이 실제로 밀리 초임을 나타내는 신뢰할만한 소스를 실제로 인용하지 않았습니다. 나는 당신이 발견 한이 두 기사가이 행동이 갑자기 변한 것보다 훨씬 더 가능성이 높다고 생각합니다. –