2009-11-10 5 views
1

J'ai une erreur 10022 dans une application utilisant des sockets en C# .NET3.5.Erreur de socket C# 10022

Dans mon code, je lie le socket à l'adresse IP locale. Lorsque je n'en ai plus besoin, je le déconnecte (reader.socket.Disconnect (true);) avec "true" pour pouvoir le réutiliser

Mais quand j'appelle le "bind" méthode à nouveau, il se bloque avec l'erreur 10022 (argument non valide)

Si je définis la ligne avec cette méthode comme un commentaire, il se bloque alors sur la ligne "écouter", en disant qu'une connexion est déjà établie (bien que je appelé déconnexion!)

Toute idée?

Merci


Voici la partie de code qui échouent:

public void WaitConnexion(IPEndPoint localEP) 
     { 
      if (localEP.Port != 9000) 
      { 
       MessageBox.Show("Le port doit être 9000"); 
       return; 
      } 
      LocalEndPoint = localEP; 

      if (reader.socket.Connected) 
      { 
       MessageBox.Show("Vous êtes déjà connecté", "Conflit de connexion", MessageBoxButton.OK, MessageBoxImage.Exclamation); 
       return; 
      } 

      // on bind le socket avec le endpoint local, et on le met en attente de connexion asynchrone 

      // reader.socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 


      reader.socket.Bind(localEP); 

      reader.socket.Listen(1); 

      reader.socket.BeginAccept(new AsyncCallback(WaitConnexionCallBack), reader.socket); 
     } 

et est ici la méthode diconnect avec son rappel:

public void Disconnect() 
     { 
      if (!reader.socket.Connected) 
       return; 


      reader.socket.BeginDisconnect(true, new AsyncCallback(DisconnectCallBack), reader.socket); 


     } 

     private void DisconnectCallBack(IAsyncResult result) 
     { 
      reader.socket = (result.AsyncState as Socket); 
      reader.socket.EndDisconnect(result); 


      if (Disconnected != null) 
       Disconnected(this, EventArgs.Empty); 



     } 

Répondre

1

J'ai trouvé la solution.

Il semble que le garbage collector n'a pas été appelé assez rapidement, laissant en mémoire la valeur d'une socket qui était réellement disposée.

Modification de code dans DisconnectedCallBack:

reader.socket = (result.AsyncState as Socket); 
    reader.socket.EndDisconnect(result); 
    reader.socket.close(0); 
    GC.Collect(); // call garbage collector to clean the socket 

modification de code dans WaitConnexion:

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

Re-création de la douille.