2013-07-30 2 views
2

여기에 일부 게시물을 기반으로 소켓 KeepAlive를 설정하기위한 다음과 같은 간단한 방법을 작성했으며 작동하는 것 같습니다. 두 서비스 간의 연결을 끊기 위해 이더넷 케이블을 뽑은 후 네트워크 라이브러리가 SocketAsyncEventArgs Completed 이벤트에서 전송 된 0 바이트를 처리하고 Disconnected 이벤트를 발생시킵니다.소켓 KeepAlive 단위

하지만 몇 가지 이유로 밀리 초 대신 1/100 초를 사용해야합니다. 이 문서에서 찾을 수있는 모든 문서는 밀리 초를 사용해야 함을 나타냅니다.

(편집) 내가 지금 바이트가 이러한 다른 두 가지 방법으로 경기를 반환 것을 확인했다 :

http://www.codeproject.com/Articles/117557/Set-Keep-Alive-Values

http://social.msdn.microsoft.com/Forums/en-US/35dfb50e-1e14-40c1-af01-f359be4d6a02/how-to-set-socket-keep-alive-timeinterval-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; 
} 
+0

귀하의 기능은 두 가지 일을합니다. 관련 코드 만 표시하십시오. 'tcp_keepalive struct creation code "(모든 것은'socket.IOControl()'호출을 제외하고)를 byte []를 반환하는 세 개의 인자 ('enabled','time','interval')를 가진 별도의 메소드로 추출합니다. '를 사용하고 필요한 값에 대한 예상 및 실제 출력을 표시합니다. 이렇게하면 IOControl에 전달하기 전에 포함 할 것으로 예상되는 내용이 바이트에 포함되어 있는지 테스트하고 확인할 수 있습니다. – CodeCaster

+1

CodeCaster 주석 주셔서 감사합니다. 미안하지만, 실제로 메소드를 단순화하려고했지만 좋은 프로그래밍 방법을 사용하고 유닛 테스트를하는 것이 결코 아프지는 않습니다.) 메소드를 약간 변경하고 내가 수행 한 테스트를 반영하도록 포스트를 편집했습니다. 내 결론은? KeepAlive에는 밀리 초가 아닌 1/100 초가 필요합니다. –

+0

값이 실제로 밀리 초임을 나타내는 신뢰할만한 소스를 실제로 인용하지 않았습니다. 나는 당신이 발견 한이 두 기사가이 행동이 갑자기 변한 것보다 훨씬 더 가능성이 높다고 생각합니다. –

답변

1

댓글에 대한 내 자신의 질문에 대한 답변입니다. 미안 해요. 첫 번째 게시물입니다. 이렇게 대답해야합니다.

이것의 요점은

파라미터 이해된다

  • 이 KeepAliveTime가 킵 얼라이브 메시지를 송신하는 간격이다.

  • KeepAliveInterval은 초기 KeepAlive 메시지가 확인되지 않은 경우 재전송 프로브를 보내는 간격입니다.

관련 문제