免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 11764 | 回复: 19
打印 上一主题 下一主题

[C++] 服务器端处于CLOSE_WAIT状态,客户端处于FIN_WAIT_2状态 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-13 19:44 |只看该作者 |倒序浏览
原来程序结构是 客户端socket调用服务器端,然后服务器端telnet过去执行命令。现在改成服务器直接在服务器本机执行命令(popen方式)。
原来一切正常,现在遇到的问题是如果命令(shell脚本)没有结束则 服务器端处于CLOSE_WAIT状态,客户端处于FIN_WAIT_2状态。
不知道问题出在哪里。即使我执行命令用后台方式执行也不行。请老鸟指点下,什么原因。

论坛徽章:
1
天蝎座
日期:2013-12-06 18:23:58
2 [报告]
发表于 2011-09-13 21:36 |只看该作者
首先关闭连接的一端会出现close_wait状态,客户端应该关闭,不关闭就会处于fin_wait_2状态。

论坛徽章:
0
3 [报告]
发表于 2011-09-13 21:53 |只看该作者
服务器端处于CLOSE_WAIT状态,说明应用程序没有关闭相应的socket,也就不会发送最后的FIN,所以客户端处于FIN_WAIT_2状态

论坛徽章:
0
4 [报告]
发表于 2011-09-13 22:37 |只看该作者
C        :          S
   fin========>
fin_wait_1          close_wait
   ack<=======
fin_wait_2

此时 客户端处于fin_wait_2 ,而服务器出于close_wait。
所以,服务器应该在发送个fin,,自己变成last_ack状态,而客户端收到fin,发送ack,并且自己转变为time_wait。

论坛徽章:
0
5 [报告]
发表于 2011-09-13 23:47 |只看该作者
具体点就是
1.我的socket服务器端Serve进程执行shell脚本 内容如 sleep 60;ls -l;  shell脚本采用后台方式执行。

2.Serve进程用popen调用shell脚本,然后用select获得管道返回信息。然后将返回信息返回给客户端。这一步中花费时间远小于60秒。此时脚本还在运行中。此时这个时候就会出现上面的这个状态。服务器端处于CLOSE_WAIT状态,客户端处于FIN_WAIT_2状态 。

3.等shell脚本完毕后,服务器端又正常处于监听状态。

一句话就是我想实现socket调用脚本,不等脚本执行完毕就返回信息给客户端,只返回echo $?的结果给客户端,而不是脚本执行结果。但现在一直遇到这个问题。

论坛徽章:
0
6 [报告]
发表于 2011-09-14 09:51 |只看该作者
回复 5# chllcy


    不等脚本执行完毕就返回信息给客户端,只返回echo $?的结果给客户端,会有这样的线上应用?

    只要即时关闭新连接的socket即可,你也可以采取多进程的方式。

论坛徽章:
0
7 [报告]
发表于 2011-09-14 11:15 |只看该作者
脚本执行结果会写到数据库里面,然后前台结果从数据库中获得。因为脚本执行的时间未知,可能要几个小时呢,所以前台不能等待。
已经用了popen了,难道还要用socket  fork个子进程执行popen???

论坛徽章:
0
8 [报告]
发表于 2011-09-14 16:56 |只看该作者
回复 7# chllcy


    贴一下你的代码看看

论坛徽章:
0
9 [报告]
发表于 2011-09-14 17:24 |只看该作者
ctrl+c结束的程序??

论坛徽章:
0
10 [报告]
发表于 2011-09-14 17:25 |只看该作者
总之,没有close就退出了

所以,退出前,close一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP