2012-01-19 3 views
1

원격 소켓 연결이 끊어 졌는지 감지하는 몇 가지 방법을 시도해 왔습니다.소켓 연결 확인

현재 소켓이 연결되어 있는지 확인하기 위해이 작업을 수행합니다. 어떤 이유로

public void CheckSocket() 
{ 
    try 
    { 
     bool test1 = s.Poll(_MicrosecondFaultTolerance, SelectMode.SelectRead); 
     bool test2 = (s.Available == 0); 
     if (test1 && test2) 
      _Active = false; 
    } 
    catch 
    { 
     _Active = false; 
    } 
} 

이 첫 번째 드롭에 완벽하게 아무 질문도하지 때마다 작동하지만 이후 검사가 거짓 따라서 클라이언트가 고려되지 않습니다 "분리"에 _Active를 설정하지 않습니다. Connection을 테스트하거나 더 신뢰할만한 결과를 얻을 수있는 다른 방법이 있습니까?

+0

가능한 복제본 [C#에서 소켓 연결/연결 해제 여부를 확인하는 방법] (http://stackoverflow.com/questions/2661764/how-to-check-if-a-socket-is-connected- 연결이 끊긴에서 - c) –

답변

2

일단 소켓 아래의 연결이 끊어지면 소켓을 닫아야하기 때문에 "첫 번째 드롭"이 무슨 뜻인지 잘 모르겠습니다. 그것들은 모두 CheckSocket() 함수 밖에서 무엇을하고 있는지에 달려 있습니다. 그러나 모든 것이 올바르게 처리되었다고 가정하면 기본 연결이 유휴 상태 일 경우 소켓 폴링만으로는 안정적으로 작동하지 않습니다.

연결이 끊어지는 것은 기본 전송에 트래픽이있는 경우에만 검색 할 수 있습니다. 유휴 상태에서 연결을 포기하면 (닫히지 않음) 영원히 조용히 앉아있게됩니다. 유휴 상태에서 버려진 연결을 감지하려면 setsockopt()SO_KEEPALIVE과 함께 사용하십시오. TCP는 정기적으로 더미 트래픽을 다른 쪽과 교환하여 연결이 여전히 살아 있는지 테스트하고 NAT 또는 기타 동적 라우팅 규칙이 시간 초과되지 않도록합니다. TCP의 기본 시간 초과이므로 30 초 이상 방울을 감지하는 데 여전히 걸릴 수 있습니다.