2012-03-10 2 views
2

알았어. 거기에 많은 정보가 있다는 것을 알고 있으며, 나는이 모든 것을 읽었으며이 작업을하기 위해 다른 방법을 시도했다 !!Socket.Poll 및 Socket.Connected를 원하는대로 작동하지 못함

랩톱에서 실행되는 소켓 서버 프로그램이 있습니다. 그런 다음 동일한 LAN을 통해 서버에 무선으로 최대 50 대의 랩톱을 연결합니다. 클라이언트 랩톱은 모두 Socket.ConnectAsync를 사용하여 서버에 연결하고 서버는 비동기 방법을 사용하여 데이터를 보내고받습니다. 서버는 연결된 클라이언트 랩톱 목록을 사용자에게 보여 주며이 목록은 정확하고 클라이언트 연결이 끊어지면 연결할 때마다 나타납니다. 그러나 클라이언트 랩톱은 특정 상황 (예 : 서버 프로그램이 충돌하는 경우, 서버 랩톱이 대기 모드로 전환되는 경우 등)에서 서버로의 연결이 끊어 졌음을 감지하지 못하는 것 같습니다. 클라이언트 랩톱에서 폴링하는 타이머가 있습니다. 접속 5 초마다 다음은 :

 bool SocketConnected(Socket s) 
    {    
     bool part1 = s.Poll(0, SelectMode.SelectWrite); 

     bool part2 = (s.Available == 0); 
     if (!part1 && part2) 
     { 

      return false; 
     } 
     else 
     { 
      return true; 
     } 
    } 

I 모든 selectmodes (SelectWrite, SelectRead, SelectError)를 사용하여 시도 다른 타임 아웃 값을 사용하여 시도 하였다. 나는이 작업 후에 s.Connected 값을 검사 해 보았고 연결 상태를 결정하는 다른 방법의 모든 방법을 시도했지만 아무 것도 신뢰할 수있는 결과를 생성하지 못하는 것 !! 나는 5 초마다 더미 정보를 보내고 s를 확인함으로써 내가 원하는 결과를 얻을 수 있다고 생각한다. 그러나 그렇게 한 후에는 각 랩탑이 이미 많은 양의 데이터를 서버에 보내고 있기 때문에 실제로 그렇게하고 싶지는 않다. . 어떤 도움도 대단히 감사합니다! 감사합니다

답변

2

연결이 살아 있는지 확인하는 유일한 방법은 상대방에게 무언가를 보내고 도착하는지 확인하는 것입니다. 수시로 "ping"값을 송수신하거나 수동으로 KeepAlive socket option을 활성화하여이 작업을 수행 할 수 있습니다.

1

Socket.Poll에 대한 MSDN 문서는 정확한 상황에 대해 매우 명시 적이다 (서버 충돌, 대기는) 당신이 언급 한 :

같은 깨진 네트워크 케이블로 연결 문제, 특정 종류를 감지 할 수없는이 방법, 또는 원격 호스트가 비정상적으로 종료되었음을 나타냅니다. 이러한 종류의 오류를 감지하려면 데이터를 보내거나 받아야합니다.

관련 문제