我在使用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);
}
答案 0 :(得分:1)
我找到了解决方案。
似乎垃圾收集器没有被足够快地调用,在内存中放入一些实际处理掉的socket的值。
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);
重新创建套接字。