程序关闭,端口仍在监听

anguswdm 2013-07-22 04:16:02
写了个简单的网络程序,当我把程序强制关闭(比如在进程管理器关闭)的之后,这个程序开的端口还是处于监听状态。如图所示,但是根据图中的PID去进程管理器中查找,却找不到有这个 7460的进程,请问大家这是怎么回事?如果这个时候我再启动程序,bind到10001这个端口必错,怎么才能关掉这个端口?
...全文
3792 46 打赏 收藏 转发到动态 举报
写回复
用AI写文章
46 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2015-06-25
  • 打赏
  • 举报
回复 1
《Windows编程启示录》 19.6 为什么有些进程在被终止之后还停留在任务管理器中 当某个进程结束时(可能是正常结束,也可能是因为调用了像TerminateProcess之类的函数),这个进程的用户态模块将被删除。但内核态模块只有在与线程相关的所有驱动程序执行完成之后才会被删除。 例如,如果某个线程正处于I/O操作中,那么将会给负责I/O的驱动程序发送一个内核信号来取消这个操作。 如果驱动程序的行为是良好的,那么它将清除与这个未完成I/O相关的一些信息并且释放线程。 如果驱动程序的行为是不好的(可能是因为驱动程序管理的硬件表现出奇怪的行为),那么可能需要花很长的时间来清除这个未完成的I/O。在这段时间里,驱动程序将不会释放这个线程(以及这个线程所在的进程)。实际的情况要更复杂一些,但这里的简单模型对于我们的讨论已经足够。 …… 换句话说,如果你终止了某个进程后还能在任务管理器中看到这个进程,那么实际上这个进程已经停止运行了,只不过还有些残留的信息保留在系统中,只有当与这个进程相关的所有驱动程序都完成了清除操作并且指向这个进程的句柄都已经关闭,进程才会完全消失。
赵4老师 2015-06-25
  • 打赏
  • 举报
回复
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters] "TcpTimedWaitDelay"=dword:0000001e
tiankong_bear 2015-06-24
  • 打赏
  • 举报
回复
现在这个情况,下策是,捕捉程序奔溃的异常,然后在异常处理代码里面close掉
shenyi0106 2015-05-25
  • 打赏
  • 举报
回复
找一个tcpview.exe的小程序,查看一下是谁占用了你的10001端口
qwd108114 2015-05-25
  • 打赏
  • 举报
回复
引用 33 楼 ren0065 的回复:
程序关闭的时候把socket给close掉, 或者先shutdown再close. 总之这种问题99%是没正常关闭造成.
worldy 2015-05-21
  • 打赏
  • 举报
回复
好像要过一阵子,关闭的端口才能使用,可能系统是延时关闭吧
lihao123456 2015-05-21
  • 打赏
  • 举报
回复
楼主这个问题找到解决方法了吗,我也遇到这个问题了,进程都不存在了,端口还是被占用着,求分享解决方法。
翅膀又硬了 2014-11-26
  • 打赏
  • 举报
回复
引用 20 楼 anguswdm 的回复:
[quote=引用 19 楼 ljb882009 的回复:] 那就先解决前面的问题。
前面的问题是别的组的同学做的,只提供DLL,无能为力啊 我只能尽量保证我这里异常关闭的时候不出幺蛾子,但现在出了[/quote]你可以再弄一个单独的进程,调用它们的动态库。然后你的服务器程序,再跟这个进程通信。
dvlinker 2014-11-24
  • 打赏
  • 举报
回复
这个问题我们也遇到过的,进程异常退出,端口仍然被占用,或者进程被强制杀掉,导致端口一直被占用,这样程序在重启后bind端口失败。 明天到公司去问一下网络相关的专家,问问他们是如何解决这个问题的
聚义舔刀 2014-11-24
  • 打赏
  • 举报
回复
试着捕捉崩溃的异常,然后在处理。别人写的DLL也是可以在你的程序里容错的。
Marcelxx 2014-11-24
  • 打赏
  • 举报
回复
去看看TCP的状态转换图,你这个属于监听套接字,应该是在你程序关闭的时候没有关闭套接字造成的。
MrSoda 2014-11-15
  • 打赏
  • 举报
回复
哦,我也遇到过,就是程序某种原因崩溃了,但是端口没有释放 可以在命令行里 netstat -nao 找到占用端口的PID 然后 taskkill -PID 7460 -F 强制关闭进程
BrillianceRen 2013-07-29
  • 打赏
  • 举报
回复
程序关闭的时候把socket给close掉, 或者先shutdown再close. 总之这种问题99%是没正常关闭造成.
三楼 2013-07-29
  • 打赏
  • 举报
回复
引用 31 楼 z8323664 的回复:
[quote=引用 30 楼 davidyu720 的回复:] [quote=引用 29 楼 anguswdm 的回复:] [quote=引用 28 楼 alphaxz1 的回复:] 进程肯定存在
进程真没存在,起码任务管理器中没有[/quote] 进程肯定不存在了。真没有子进程吗?[/quote] 我也遇到过此问题啊, 进程真不在,但是端口就还在。不过后来重启了就可以了。不明白LZ 为什么重启后都不行, 是不是有什么服务开着??[/quote] 重启应该可以,楼主说的是自己的是不重启的情况
z8323664 2013-07-29
  • 打赏
  • 举报
回复
引用 30 楼 davidyu720 的回复:
[quote=引用 29 楼 anguswdm 的回复:] [quote=引用 28 楼 alphaxz1 的回复:] 进程肯定存在
进程真没存在,起码任务管理器中没有[/quote] 进程肯定不存在了。真没有子进程吗?[/quote] 我也遇到过此问题啊, 进程真不在,但是端口就还在。不过后来重启了就可以了。不明白LZ 为什么重启后都不行, 是不是有什么服务开着??
anguswdm 2013-07-25
  • 打赏
  • 举报
回复
引用 28 楼 alphaxz1 的回复:
进程肯定存在
进程真没存在,起码任务管理器中没有
琅琊榜 2013-07-25
  • 打赏
  • 举报
回复
进程肯定存在
davidyu720 2013-07-25
  • 打赏
  • 举报
回复
引用 29 楼 anguswdm 的回复:
[quote=引用 28 楼 alphaxz1 的回复:] 进程肯定存在
进程真没存在,起码任务管理器中没有[/quote] 进程肯定不存在了。真没有子进程吗?
davidyu720 2013-07-24
  • 打赏
  • 举报
回复
引用 14 楼 anguswdm 的回复:
[quote=引用 12 楼 ljb882009 的回复:] 你socket确认都关闭了吗?
不确认,也许异常关闭的时候没有到close这里。 但是 程序的进程都不在了啊,也没有子进程。 7460这个PID在任务管理器中也没有[/quote] Windows的句柄管理不会这么糟糕吧? 这里有篇帖子,认为结束子进程后,端口就能被释放了。你需要仔细确认下 到底有没有启动子进程,子进程是否都被结束了。 http://serverfault.com/questions/181015/how-do-you-free-up-a-port-being-held-open-by-dead-process "Normally the OS cleans up these sorts of things, but only when the process record goes away. While the process may not appear to be running any more, there is at least one thing that can keep a record of it around, in order to prevent reuse of its PID. This is the existence of a child process that is not detached from the parent." 对此答案的回复是:"Thanks for your hint!! Killing orphand process really solved the problem. "
加载更多回复(26)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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