2012-02-21 18 views
0

C#ソケットプログラミングを使用してTCPクライアント/サーバーアプリケーションを開発しています。時には、サーバー(Windowsサービス)がポート(8089)上で実行されているのにクライアント要求を聞いていないため、ポートスキャナーでポートをテストすると、ポートが応答!ここに私のサーバーコードです:TCPソケットが応答していません

まず、

ます。private void MainThread(){ バイト[]バイト=新しいバイト[1024];

 IPEndPoint localEndPoint = new IPEndPoint(0, this.port); 

     Socket listener = new Socket(AddressFamily.InterNetwork, 
      SocketType.Stream, ProtocolType.Tcp); 

     try { 
      listener.Bind(localEndPoint); 
      listener.Listen(100); 

      while (active) { 
       mainDone.Reset(); 

       listener.BeginAccept(new AsyncCallback(AcceptCallback),listener); 

       while (active) 
        if (mainDone.WaitOne(100, true)) 
         break; 
      } 
      listener.Close(); 

     } catch (Exception e) { 
      if (OnError != null) 
       OnError(this, e.ToString()); 
      LogManager.LogError(e, "TCPSimpleServer MainThread"); 
     } 

その後、

private void AcceptCallback(IAsyncResult ar) { 
     Socket handler = null; 
     try 
     { 
      mainDone.Set(); 

      Socket listener = (Socket)ar.AsyncState; 
      handler = listener.EndAccept(ar); 

      if (OnConnect != null) 
       OnConnect(this, handler); 

      StateObject state = new StateObject(); 

      state.workSocket = handler; 
      state.endPoint = (IPEndPoint)handler.RemoteEndPoint; 
      stateObjectDictionary.Add(state, state.workSocket); 
      handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
       new AsyncCallback(ReadCallback), state); 
     } 
     catch (ObjectDisposedException) 
     { 
      // Connection closed by client 
      if (OnDisconnect != null) 
       OnDisconnect(this, (IPEndPoint)handler.RemoteEndPoint); 
      return; 
     } 
     catch (Exception ex) 
     { 
      LogManager.LogError(ex, "TCPSimpleServer AcceptCallback"); 
      return; 
     } 

と最後に、

private void ReadCallback(IAsyncResult ar) { 
     try 
     { 
      String content = String.Empty; 
      StateObject state = (StateObject)ar.AsyncState; 
      Socket handler = state.workSocket; 

      int bytesRead = 0; 
      try 
      { 
       bytesRead = handler.EndReceive(ar); 
      } 
      catch (Exception ex) 
      { 
       // Connection closed by client 
       if (OnDisconnect != null) 
        OnDisconnect(this, state.endPoint); 
       handler.Close(); 
       return; 
      } 

      if (bytesRead > 0) 
      { 
       string data = Encoding.Default.GetString(state.buffer, 0, bytesRead); 

       if (OnDataAvailable != null) 
        OnDataAvailable(this, handler, data); 
       try 
       { 
        handler.BeginReceive(state.buffer, 0, StateObject.BufferSize, 0, 
         new AsyncCallback(ReadCallback), state); 
       } 
       catch (Exception e) 
       { 
        if (OnError != null) 
         OnError(this, e.Message); 
        LogManager.LogError(e, "TCPSimpleServer ReadCallback"); 
        handler.Close(); 
       } 
      } 
      else 
      { 
       // Connection closed by peer 
       if (OnDisconnect != null) 
        OnDisconnect(this, state.endPoint); 
      } 
     } 
     catch (Exception ex) 
     { 
      LogManager.LogError(ex, "TCPSimpleServer ReadCallback"); 
     } 
    } 

私はEndReceive()メソッドで発生したソケット(ハンドラproblen場合、問題は、最後の方法ReadCallback()であると思います)決してポートを解放しないでください。助けてください?

答えて

0

それは、クライアントがサーバーのをブロックすることができ、次のようになります。

while (active) 
    if (mainDone.WaitOne(100, true)) 
     break; 
関連する問題