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#套接字仍在侦听_C#_Sockets - Fatal编程技术网

应用程序退出后C#套接字仍在侦听

应用程序退出后C#套接字仍在侦听,c#,sockets,C#,Sockets,我目前正在调试一个使用套接字与客户端连接的服务器应用程序。当我优雅地关闭应用程序时(包括socket.close()),或通过visual studio强制关闭,或通过终止进程关闭应用程序时,端口仍处于绑定状态,并仍报告为正在侦听,这已得到TCPView、命令提示符中的netstat和AnVir任务管理器的确认,所有这些都显示端口仍绑定到我选择的端口,并指示它仍在积极侦听连接。我提到的所有工具都没有列出与连接相关联的流程 试图通过TCPView、AnVir或任何其他工具强制关闭连接没有任何效果。

我目前正在调试一个使用套接字与客户端连接的服务器应用程序。当我优雅地关闭应用程序时(包括socket.close()),或通过visual studio强制关闭,或通过终止进程关闭应用程序时,端口仍处于绑定状态,并仍报告为正在侦听,这已得到TCPView、命令提示符中的netstat和AnVir任务管理器的确认,所有这些都显示端口仍绑定到我选择的端口,并指示它仍在积极侦听连接。我提到的所有工具都没有列出与连接相关联的流程

试图通过TCPView、AnVir或任何其他工具强制关闭连接没有任何效果。唯一可以解除绑定的方法是完全注销windows或重新启动电脑


当我的应用程序退出时,如何确保端口未绑定?socket.Close()不应该处理这个问题吗?

我不想回答我自己的问题,但似乎我偶然找到了解决这个问题的某种方法。经过深思熟虑,我一时兴起,决定确保没有需要下载的任何windows更新(我使用的是windows 7),并找到了几个可用于.NET的更新(即“windows 7上Microsoft.NET Framework 3.5.1的安全更新…)

我允许他们下载和安装,发现一旦他们完成,当我运行我的应用程序,然后用socket.Close()优雅地关闭它时,我发现这个端口立即变得免费!我还测试了让服务器开始监听端口,然后通过VisualStudio中的“停止调试”按钮强制关闭应用程序,并发现端口也会自动关闭


可能是更新修复了一个bug,也可能是更新安装的文件碰巧覆盖了某个bug。不管怎样,我写的代码似乎没有什么问题,socket.Close()可以再次被信任

你要关闭所有的连接吗?侦听器有一个接受所有侦听器的主套接字。每次建立新连接时,都会创建一个新套接字。因此,在AsyncAccept方法中,您可以创建一个list对象来获取所有套接字。关闭服务器时,可以通过列表枚举以关闭套接字。然后关闭主监听插座。我相信我的意思是没有其他连接要关闭。我对服务器应用程序所做的一切就是启动它,然后开始监听端口,然后关闭套接字,然后关闭应用程序-没有任何客户端应用程序连接到服务器,因此,通常与连接的客户端相对应的套接字与此问题无关。每个连接都是具有自己套接字的克隆连接。关闭主侦听连接不会关闭克隆连接。如果从cmd.exe>NetStat-a运行,通过查看应用程序的端口号,您将看到与应用程序关联的所有TCP连接。事实上,我可以看到您在NetStat中提到的连接(尽管只有一个)。当我让应用程序运行(没有连接任何客户端)时,服务器在给定端口上侦听,我可以在netstat中看到与服务器的调试过程匹配的结果,并且看起来很好。但是,当我退出应用程序时,netstat显示相同的ip/端口仍在侦听连接,但没有关联的进程。当我尝试重新启动服务器应用程序时,我收到一个异常,表明该端口已在使用中,这已由netstat确认。您可以在asyn accept方法中收集所有连接。可能还有其他方法。我一直知道这些连接存在,但从未见过关闭所有连接的代码。在网上搜索你应该能找到一个解决方案。