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# TcpListener套接字在程序退出后仍处于活动状态_C#_Sockets - Fatal编程技术网

C# TcpListener套接字在程序退出后仍处于活动状态

C# TcpListener套接字在程序退出后仍处于活动状态,c#,sockets,C#,Sockets,我正试图在程序退出时停止TCP侦听器。我不关心套接字或任何活动客户端套接字上当前活动的任何数据 套接字清理代码基本上是: try { myServer.Server.Shutdown(SocketShutdown.Both) } catch (Exception ex) { LogException(ex) } myServer.Server.Close(0) myServer.Stop() myServer是一个TCPListener 在某些情况下,关机将引发异常 Syst

我正试图在程序退出时停止TCP侦听器。我不关心套接字或任何活动客户端套接字上当前活动的任何数据

套接字清理代码基本上是:

try
{
    myServer.Server.Shutdown(SocketShutdown.Both)
}
catch (Exception ex)
{
     LogException(ex)
}
myServer.Server.Close(0)
myServer.Stop()
myServer是一个TCPListener

在某些情况下,关机将引发异常

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

2010年5月14日编辑

经过进一步调查,可以抛出异常,并正确关闭套接字

有时,即使在应用程序退出后,netstat也会显示套接字仍处于侦听状态

我还没能创造出最终的复制场景,它似乎是随机发生的

客户端套接字是独立清理的


您有什么建议可以帮助我关闭此套接字吗?

请在关闭前尝试调用Stop…

退出应用程序后,套接字将无法处于侦听状态。然而,它可能处于等待状态;这完全正常。

在发生异常时,使用finally块调用Close()

try
{
    myServer.Server.Shutdown(SocketShutdown.Both);
}
catch (Exception ex)
{
    LogException(ex);
}
finally
{
    myServer.Server.Close(0);
    myServer.Stop();
}
我还很好奇,是否因为您没有提到的某些规范,需要对底层套接字进行操作?TCPListener/Client的设计使您在大多数情况下不必担心那些通信机制

另外,如果这没有帮助,SocketException返回的错误代码是什么?

也有类似的问题: -TcpListener正在等待客户端连接 -封闭处置

有同样的问题(win7,win2k)


到目前为止,一个对我有效的解决方案是在处理侦听器时关闭与客户端的每个连接。如果程序存在,而与客户端的连接仍处于活动状态,则这些连接可能会在程序关闭后保留。

应用程序不再显示在任务管理器中。与套接字关联的PID与任务管理器中的任何进程都不相关。应用程序退出三小时后,根据netstat侦听的连接状态。我已退出程序,当前正在侦听套接字。如果您想了解更多信息,请告诉我。您能验证使用和吗?TCPView应给出与netstat相同的结果,但Process Explorer比Task Manager更详尽。TCPView以更易于阅读的格式显示与netstat相同的信息。谢谢你提醒我。它显示:3580 TCP PCNAME:19000 PCNAME:0正在侦听。Process Explorer显示可执行文件未运行。Hmmm。。。我所能想到的唯一一件事就是弄乱了内核进程结构。很多病毒都是这样做的。也可能是网络驱动程序错误。我至少会检查更新。这绝对不是正确的行为——我的意思是,就操作系统/驱动程序而言:在我看来,C#侦听套接字的行为相当怪异。或者可能只是窗户。我有一个类似的(尚未解决的)问题,也许那里的答案会帮助你,尽管我们的问题有点不同:问题非常相似。套接字保持在侦听状态,不会更改为TIME\u WAIT。重新启动应用程序会导致“每个套接字地址只使用一次…”错误。我只是在这方面做得很愚蠢,我现在得到了解决方案。问题是,它在重启程序后对我有效,只是没有重启就不行。程序中是否使用线程?是的,应用程序是多线程的。线程设置为IsBackground=true,当主GUI线程结束时,该线程应结束。看起来线程应该关闭,服务器应该停止。大多数情况下是这样的,但在异常发生和处理时不是这样。您是否尝试过在异常捕获上设置myServer=null(使其不可访问&GC-able)?我想您需要在之后重新实例化它…套接字关闭是因为程序退出后这个打开的套接字而添加的。在某些情况下(不是全部,也不是完全可复制的),套接字在侦听状态下保持打开状态。在生产代码中,close和stop命令包装在另一个try-catch-finally构造中,并带有更多日志记录。这些命令不会引发异常。根据错误代码判断,我相信错误代码是WSAENOTCONN 10057。进一步研究后,在其他时间抛出关闭错误,套接字正常关闭。我将编辑主要问题以添加该信息。谢谢。想到可能的解决办法,我想知道客户是否是原因。套接字的Dispose是对客户端关闭的响应。因此,套接字的孤立状态可能是客户端未正确断开连接的症状。客户端的连接和断开是否以相对原子的方式设计?我还认为追踪有助于揭示问题。如果您还没有设置,请查看此链接:我会编写说明,但我没有足够的字符。这将需要一些筛选,但跟踪应能揭示通信中断发生的位置。