免费注册 查看新帖 |

Chinaunix

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

[C] 如何安全地关闭一个socket [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-03-29 11:12 |显示全部楼层 |倒序浏览
此前在网上看一篇文章,说关闭socket需要走一系列流程,以确保双方能安全地关闭一个通信,即所有数据都成功接收,且没有无谓的报错。
具体流程为:

- 先以SHUT_WR把套接字shutdown,相当于发送个EOF给对方;
- 然后一直read,直到返回0,防止错过pending数据,会发送RST给对方;
- 最后才close掉socket。

我的问题是,这个流程是否靠谱。如果靠谱的话,这个流程是否对Blocking和Non-Blocking的socket都有效。
因为如果Non-Blocking的话,read的时候,如果没有pending数据的话,应该是返回EWOULDBLOCK或者EAGAIN吧。

感觉这个流程需要双方配合,例如A想关闭socket,那先shutdown,而B发现socket被shutdown(即read返回0)之后,也把socket给close掉,
这样A也就可以read到0,最后关闭socket。

那如果A是一个epoll的服务器,当A想主动关闭一个socket,是不是只需要先shutdown,然后等待下次该socket的EPOLLIN事件触发,且read
返回0,再把它close掉就可以了。

谢谢。

论坛徽章:
0
2 [报告]
发表于 2016-03-29 13:40 |显示全部楼层
谢谢楼上两位的解答,简化思维之后,就简单多了。
因为我后来在放狗搜索的时候,也确实有人说,就用最基本的发req、收rsp的方法,他这么写了10来年了,毛问题没有。
只不过有的时候,强迫症发作,看到类似头一偏文章里面的内容,就会身不由己地去纠缠不清了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP