C#中如何关闭侦听端口?

yuanfeng1969 2013-01-16 10:15:26
用C#写的一个服务端程序,打开了一个TCP侦听端口,现在碰到个问题就是关不掉这个端口,在程序里写了listener.Close()、System.GC.Collect()等语句都不起作用,程序关掉退出了n久,用netstat -a命令还是能看到那个端口还是处于listenering状态。
补充一下,侦听端口的打开和侦听我是单独放在一个线程里执行的。
用什么方法可以在程序退出时随之关闭侦听端口呢?
...全文
1068 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuanfeng1969 2013-01-16
  • 打赏
  • 举报
回复
引用 8 楼 gxingmin 的回复:
不会啊,tcp连接是信任连接,断开就立即断了
我又测试了几次,客户端主动关闭连接的场合是OK的,但保持客户端运行的状态下关闭服务器程序的话,客户端上等一小会儿后netstat -a就看不到连接了,但服务器端还是能看到,而且一直处于CLOSE_WAIT状态。。。
gxingmin 2013-01-16
  • 打赏
  • 举报
回复
不会啊,tcp连接是信任连接,断开就立即断了
yuanfeng1969 2013-01-16
  • 打赏
  • 举报
回复
引用 6 楼 gxingmin 的回复:
估计你还是其他地方代码有问题
确实如你所说其他地方代码也有问题,除了服务器端的守护线程执行侦听之外,和客户端建立连接后在该连接上的往来通信等处理我也是建立单独的线程来处理的,原来的代码上程序结束时忘了结束这个线程,造成了程序服务器程序虽然结束了,但还是能跟客户端交互处理。现在修改了这部分代码,服务器程序一旦关闭,跟客户端之间的通信也就结束了,从客户端也无法再连接服务器了。但是!!从刚才关闭服务器程序到现在有10分钟了,服务器上还是可以看到侦听端口以及跟客户端的连接,只是这个连接状态变成了CLOSE_WAIT了。是不是连接变成死连接之后就得等待很长时间才能彻底废弃呢?
gxingmin 2013-01-16
  • 打赏
  • 举报
回复
估计你还是其他地方代码有问题
gxingmin 2013-01-16
  • 打赏
  • 举报
回复
我执行上面代码后,客户端就弹出信息“无法连接服务器”,点确定客户端就断开连接,然后开始尝试连接,不会影响到服务端啊
yuanfeng1969 2013-01-16
  • 打赏
  • 举报
回复
引用 2 楼 gxingmin 的回复:
运行上面的代码后,在用客户端连接,连接不上了
现在关闭端口的代码改成这样: listener.Close(); listener = null; System.GC.Collect(); System.GC.WaitForPendingFinalizers(); 然后在退出整个程序界面时执行下述语句 System.Windows.Forms.Application.Exit(); 情况有所好转,但是只要客户端不主动切断连接而继续保持跟服务器的通信,服务器端就算执行了上述所有代码整个程序都退出,侦听端口还是活跃的,直到客户端关闭连接服务器端才会关闭侦听端口。 有什么更好的方法可以彻底关闭连接结束侦听端口呢?
owennol 2013-01-16
  • 打赏
  • 举报
回复
Window下TCP侦听关闭后,需要等待一段时间; 你过段时间再用NetStat命令,看看侦听还有木有
gxingmin 2013-01-16
  • 打赏
  • 举报
回复
运行上面的代码后,在用客户端连接,连接不上了
gxingmin 2013-01-16
  • 打赏
  • 举报
回复
我一直是这么关的,貌似可以的啊

//m_skListen.Close();
m_skListen=null;
			
GC.Collect();
GC.WaitForPendingFinalizers();

111,098

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧