Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按客户端请求关闭服务器以意外递归结束,导致ObjectDisposedException_C#_Sockets_Objectdisposedexception - Fatal编程技术网

C# 按客户端请求关闭服务器以意外递归结束,导致ObjectDisposedException

C# 按客户端请求关闭服务器以意外递归结束,导致ObjectDisposedException,c#,sockets,objectdisposedexception,C#,Sockets,Objectdisposedexception,我正在试验套接字,并构建了一个相当简单的TCP服务器 此处提供的代码: 我在从客户端停止套接字服务器时遇到问题。在pastebin中,从第136到192行开始是服务器终止的处理程序 背后的逻辑相当简单: 断开请求客户端的连接; 从连接的客户端列表中删除客户端; 断开并移除剩余的客户端; 关闭服务器; 从列表中删除服务器。 该程序完美地执行了上述操作,但不知何故,它设法在最后挤出了一个额外的步骤-似乎意外地执行了ReceiveCallback好吧,这对我来说是意外的,然后在第100行结束了Obje

我正在试验套接字,并构建了一个相当简单的TCP服务器

此处提供的代码:

我在从客户端停止套接字服务器时遇到问题。在pastebin中,从第136到192行开始是服务器终止的处理程序

背后的逻辑相当简单:

断开请求客户端的连接; 从连接的客户端列表中删除客户端; 断开并移除剩余的客户端; 关闭服务器; 从列表中删除服务器。 该程序完美地执行了上述操作,但不知何故,它设法在最后挤出了一个额外的步骤-似乎意外地执行了ReceiveCallback好吧,这对我来说是意外的,然后在第100行结束了ObjectDisposedException:

显然,它无法在关闭客户端的关闭进程中访问。这里的问题是,我不明白为什么程序会再次进入ReceiveCallback。我在处理退出消息后返回void,但没有对其进行另一次调用

值得一提的是,只有当有两个客户端连接时才会发生这种情况。对于一个客户机,它会毫无问题地停止

不过,对我来说,这并不是请求客户端以ObjectDisposedException结束,而是另一个客户端。这仍然对我没有帮助,因为,无论如何,我不明白为什么会再次调用ReceiveCallback-客户端已断开连接,应该在我停止服务器之前将其标记为这样

如何在没有ObjectDisposedException的情况下使服务器停止


另外,括号对我来说只是旁注。由于我是async+线程的新手,我不明白某些行为是如何发生的。

可以通过在回调上添加额外的检查来解决此问题:

// Handle errors.
if (e.SocketError != SocketError.Success)
{
    Console.WriteLine("Socket error: {0}", e.SocketError.ToString());
    return;
}
SocketAsyncEventArgs.Completed将在所有情况下运行,但其SocketError将设置为不同的值

在我的例子中,它被设置为SocketError.OperationAborted what is true,我只需要做特殊处理——在我的例子中,用一个简单的返回忽略它

// Handle errors.
if (e.SocketError != SocketError.Success)
{
    Console.WriteLine("Socket error: {0}", e.SocketError.ToString());
    return;
}