C#套接字错误10022

我在使用C#.NET3.5中的套接字的应用程序中有一个错误10022。

在我的代码中,我将套接字绑定到本地IP地址。 当我不再需要它时,我只需将其断开(reader.socket.Disconnect(true);)并使用“true”即可重新使用它。

但是当我再次调用“bind”方法时,它会因10022错误(无效参数)而崩溃。

如果我将这个方法的行设置为注释,它会在“listen”行崩溃,说已经设置了连接(虽然我调用了disconnect!)

任何的想法?

谢谢


以下是失败的代码部分:

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

我找到了解决方案。

似乎垃圾收集器没有被足够快地调用,让内存中的某些套接字值实际处理掉了。

DisconnectedCallBack中的代码修改:

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

WaitConnexion中的代码修改:

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

重新创建套接字。