2009-11-10 102 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); 

重新创建套接字。