2009-11-10 125 views
1

我在使用C#.NET3.5中的套接字的應用程序中出現錯誤10022。C#套接字錯誤10022

在我的代碼中,我將套接字綁定到本地IP地址。 當我不再需要它,我只是斷開它(reader.socket.Disconnect(true);)與「真正」,以便能夠重新使用它

但是,當我調用「綁定」方法再次,它崩潰與10022錯誤(無效的參數)

如果我將此方法設置爲註釋行,它然後崩潰在線「聽」,說已建立連接(雖然我稱爲斷開連接!)

任何想法?

感謝


這裏是一個失敗的代碼部分:

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

這裏是diconnect方法,其回調:

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



     } 

回答

1

我找到了解決辦法。

似乎垃圾收集器沒有足夠快地調用,讓內存中的某些實際處置的套接字的值。

代碼修改在DisconnectedCallBack:在WaitConnexion

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

代碼修改:

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

重新創建套接字。