Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#:关闭套接字时出错?_C#_.net_Sockets - Fatal编程技术网

C#:关闭套接字时出错?

C#:关闭套接字时出错?,c#,.net,sockets,C#,.net,Sockets,我正在尝试处理控制台应用程序,处理的一部分是关闭服务器套接字,但是当我尝试时,我得到了一个SocketException,我不确定为什么 System.Net.Sockets.SocketException:'发送或接收数据的请求 不允许,因为套接字未连接和(发送时) 在使用sendto调用的数据报套接字上)未提供地址' 我在这里通过调用Socket.Shutdown来处理这个类,这就是抛出错误的地方 public void Dispose() { if (_serverSocket

我正在尝试处理控制台应用程序,处理的一部分是关闭服务器套接字,但是当我尝试时,我得到了一个SocketException,我不确定为什么

System.Net.Sockets.SocketException:'发送或接收数据的请求 不允许,因为套接字未连接和(发送时) 在使用sendto调用的数据报套接字上)未提供地址'


我在这里通过调用Socket.Shutdown来处理这个类,这就是抛出错误的地方

public void Dispose()
{
    if (_serverSocket == null)
    {
        return;
    }

    _serverSocket.Shutdown(SocketShutdown.Both);
    _serverSocket.Close();
    _serverSocket.Dispose();
}
因为

_serverSocket.Shutdown(SocketShutdown.Both);
    _serverSocket.Close();

已断开连接,因此您不需要
\u serverSocket.Dispose()不再

错误信息对我来说非常清楚。你在理解什么方面有困难?如消息所示,套接字已断开连接,因此调用
Shutdown()
是不合法的。如果没有可靠地重现问题的方法,就不可能说出您是如何陷入这种情况的,但不管怎样,您似乎只需要检查代码并决定是否真的应该调用
Shutdown()
这里。您不应该在处理后将
\u serverSocket
设置为
null
,以防止处理两次吗?理想情况下,使用
Interlocked.Exchange()
实现线程安全。但除此之外,我们还需要看到更多的类来提供帮助,因为似乎还有其他一些代码路径导致套接字关闭。