2012-08-12 2 views
3

비동기 TCP/IP 서버를 사용했지만 모든 것이 잘 작동하지만 응용 프로그램의 오류 또는 강제 종료로 인해 클라이언트의 연결이 끊어지면 클라이언트가 IO.IOException 유형의 예외. 예외는 다음 하위에서 발생합니다 클라이언트 내 TCP 서버에서 연결이 끊어 때올바른 방법으로 클라이언트가 TCP/IP에서 연결이 끊어 졌음을 감지했습니다.

Private Sub ReadCallback(ByVal result As IAsyncResult) 
     Try 


      Dim client As Client = TryCast(result.AsyncState, Client) 
      If client Is Nothing Then 
       Return 
      End If 
      'MsgBox(client.ClientID) 
      Dim networkStream As NetworkStream = client.NetworkStream 
      Dim read As Integer = networkStream.EndRead(result) **' ERRORS HERE!** 
      If read = 0 Then 
      Dim client As Client = TryCast(result.AsyncState, Client) 
      SyncLock Me.Clients 
       Me.Clients.Remove(Client.ClientID) 
       Return 
      End SyncLock 
      End If 

아래의 코드가 IO.IOException을 던졌습니다 :

Dim read As Integer = networkStream.EndRead(result) **' ERRORS HERE!** 

다른 그러면 나는 것을 방지 할 수 방법 IO.IOException 잡기 이것은 처음부터 예외를 만드는 것을 막습니다. 기본적으로 나는이 시나리오가 발생했을 때 클라이언트를 제거하고 싶습니다. 현재로서는 IO.IOException에서 클라이언트를 제거하고 메소드를 재 처리했습니다. 오히려 더 나은 방법겠습니까.

+0

'client'이 어떤 종류입니까? socket을 사용하는 대부분의 클래스에는 연결된 속성이 있습니다. 클라이언트가 null이 아닌지 확인한 후에이 사실을 확인하십시오. 거짓 인 경우 연결이 끊어졌습니다. –

+0

@ SimonHalsey 그렇지 않습니다. isConnected() 및 isClosed() 메서드는 소켓, 즉 끝점에서 수행 한 작업 만 알려줍니다. 그들은 당신에게 연결 상태에 대해 말하지 않으며, 당신이 방금 설명한대로 행동하지 않습니다. – EJP

+0

정확합니다. 그것은 단어의 나쁜 선택이었다. 연결을 닫은 경우에 대해 생각하고있었습니다. 연결이 원격으로 닫히지 않은 경우가 아닙니다. –

답변

2

예외 입니다. 깨진 연결에 대해 알려주는 TCP API 또는 콜백은 없습니다. 찾으려면 읽고 쓰거나해야합니다. 이것은 신뢰성 측면에서 TCP에 깊이 관여하도록 설계되었습니다.

1

희망이 도움이 :

Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
    IAsyncResult result = socket.BeginConnect(_ip, Port, null, null); 
    bool success = result.AsyncWaitHandle.WaitOne(500, true); // 500 is milisecods to wait 
    if (socket.Connected && socket.IsBound && success) 
    { 
      // do your work       
    }else 
    { 
    // open a new connection or show your message to user 
    } 
관련 문제