- 论坛徽章:
- 1
|
★请教:fork进程遇到端口状态不释放的问题★
了一个C/S程序,简单介绍一下:Server在6666端口监听(使用netstat可以看到6666端口状态为LISTEN),准备接收来自Client的命令,当收到Client的“启动”命令时,Server fork()一个进程,execlp()另一个程序AAA,该AAA程序内为循环,一直运行,此时使用netstat可以看到6666端口增加一个状态为CLOSE_WAIT,此时Client依然可以向Server发送其他命令。只有当Client发送“停止AAA”的命令或者手动结束AAA进程时,该CLOSE_WAIT状态才消失。
【遇到类似的问题的时候,解决的办法很简单,你用netstat -a|grep 6666看看,出现close_wait状态的是拿一个端点,这样就知道是那个进程执行了close操作或者进程异常】
之所以为这个问题苦恼,是因为:如果AAA在运行过程中,server被错误终止,则该CLOSE_WAIT将一直存在下去,尽管Server的进程已经不存在。
【很明显,你的描述是因为server执行了close引起的,因为aaa仍然在运行,因此出现在aaa这端的tcp状态一直在维持着】
此时再结束AAA,也无济于事。重启Server后,因为CLOSE_WAIT状态一直存在,Server将无法接收来自Client的命令,且Client连接Server:6666一次,Server便增加一个CLOSE_WAIT状态。我在多个UNIX平台(sun/hp/aix等)上都试过,这种CLOSE_WAIT状态不会自己关闭。所以每次都很痛苦,需要重启网卡。要么就重启系统。
【这个问题的引起可以通过kill服务和客户来快速解决,你如上的描述是不确切的,“此时再结束AAA,也无济于事”,你在结束后便迫不及待的用netstat -a|grep 6666看了状态,此时一般正在处于四分节终止的某一过程中,因为这个过程需要一段时间,因此你认为无济于事。】
请各位不吝赐教:
1、为什么fork一个进程便会产生一个CLOSE_WAIT状态?
【不是fork就会成生close_wait,而是应用程序的问题,具体参看论坛重的例子代码】
2、并且这种状态必须随着子进程的终止才能结束?
【哼,你不是说“此时再结束AAA,也无济于事”,现在却说种状态必须随着子进程的终止才能结束】
3、有没有方法避免或者解决这种CLOSE_WAIT的方法?
【有办法,问题出在应用代码】
我曾经尝试向6666端口发送RST标志位=1或者FIN=1的TCP包,也不能reset这个连接。
【很简单,因为两个断点的一段仍然存在】 |
|