2012-02-21 4 views
0

Je développe une application client/serveur TCP en utilisant la programmation socket C#. Parfois, je rencontre un problème très étrange car le serveur (windows service) s'exécute sur le port (8089) mais il n'écoute aucune requête client, et quand je teste le port avec un scanner de ports, il me dit que le port n'est pas répondant! voici mon code serveur:Le socket TCP ne répond pas

D'abord,

private void MainThread() { octet [] octets = new octet [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"); 
     } 

Ensuite,

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; 
     } 

Enfin,

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"); 
     } 
    } 

Je pense que le problème est dans la dernière méthode ReadCallback() si problen eu lieu dans la méthode EndReceive() la prise (gestionnaire) ne libère jamais le port. toute aide s'il vous plaît?

Répondre

0

pourrait-il, qu'un client peut bloquer le serveur à:

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