我有一个 C# 程序,在其中创建一个套接字,绑定它,开始监听,然后使用 beginaccept!
但是当我尝试关闭\关闭套接字时,我从 beginaccept AsyncCallback 方法中得到异常!
private void start_listening()
{
main_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
IPEndPoint iplocal = new IPEndPoint(IPAddress.Any, 11150);
main_socket.Bind(iplocal);
main_socket.Listen(5);
main_socket.BeginAccept(new AsyncCallback(OnClientConnect), null);
}
private void Disconnect_Click(object sender, EventArgs e)
{
main_socket.Shutdown(SocketShutdown.Both);
main_socket.Close();
}
public void OnClientConnect(IAsyncResult asyn)
{
try
{
clients[connected_clients] = new Client("CHANGEME", "127.0.0.1", this);
clients[connected_clients].Socket = main_socket.EndAccept(asyn);
clients[connected_clients].WaitForData();
main_socket.BeginAccept(OnClientConnect, null);
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
非常感谢!
当 main_socket 关闭时,OnClientConnect() 将被调用,但 main_socket.EndAccept() 应该抛出 ObjectDisposeException。也许您想捕获该异常并将其视为“侦听器套接字已关闭”消息。
您的代码的另一个问题是 main_socket 实际上没有连接到任何东西。在 Disconnect_Click() 中调用 main_socket.Shutdown() 也可能会抛出异常,但这一次应该是 SocketException,表示套接字未连接。我会删除 main_socket.Shutdown() 调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)