免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: XZisonsun
打印 上一主题 下一主题

[函数] close Socket 时发送tcp RST 信令而非FIN,怎么清空SOCKET读缓冲区? [复制链接]

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
1 [报告]
发表于 2013-08-22 14:33 |显示全部楼层
回复 1# XZisonsun


    先shutdown(SHUT_RDWR或者SHUT_RD)然后再close,试试。shutdown之后对端不能再发送数据,但不影响既到达的数据缓冲。然后close,关闭连接。这样应该不会再rst。

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
2 [报告]
发表于 2013-08-24 15:36 |显示全部楼层
回复 8# Aquester


    close的行为典型的情况下受linger选项的影响,针对linger的设置来讲,当其l_onoff非0,且l_linger为0,那么当套接口关闭时TCP将丢弃保留的套接口发送缓冲区的任何数据并发送一个 RST给对方。另一方面TCP的规范RFC 2525第2.17节规定了“如果缓存区有未读数据那么关闭socket将会发送RST给对放方“,linux实现符合些标准了,所以楼主情况是合理的。


RFC中的原话如下:
When an application closes a connection in such a way that it can
      no longer read any received data, the TCP SHOULD, per section
      4.2.2.13 of RFC 1122, send a RST if there is any unread received
      data, or if any new data is received. A TCP that fails to do so
      exhibits "Failure to RST on close with data pending".


linger发送RST的行为在man文档中有比较隐晦的说明:
If SO_LINGER is disabled and a close is issued, the sys-
     tem will process the close in a manner that allows the process to con-
     tinue as quickly as possible

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
3 [报告]
发表于 2013-08-24 15:37 |显示全部楼层
回复 9# cxytz01


    你的解释不完全对,详细解释看回复

论坛徽章:
17
处女座
日期:2013-08-27 09:59:352015亚冠之柏太阳神
日期:2015-07-30 10:16:402015亚冠之萨济拖拉机
日期:2015-07-29 18:58:182015年亚洲杯之巴勒斯坦
日期:2015-03-06 17:38:17摩羯座
日期:2014-12-11 21:31:34戌狗
日期:2014-07-20 20:57:32子鼠
日期:2014-05-15 16:25:21亥猪
日期:2014-02-11 17:32:05丑牛
日期:2014-01-20 15:45:51丑牛
日期:2013-10-22 11:12:56双子座
日期:2013-10-18 16:28:17白羊座
日期:2013-10-18 10:50:45
4 [报告]
发表于 2013-08-25 20:35 |显示全部楼层
回复 12# cxytz01


    close需要四次握手,并且会发送fin。 不会发送rst。
这句话有问题,你下面明明已经说了“正常终止连接的方式是发送fin,但是可以设置lingger,来使用发送rst异常终止一个连接。”,
而且我在之前的回贴中也说了。TCP的规范RFC 2525第2.17节规定了“如果缓存区有未读数据那么关闭socket将会发送RST给对放方“,所以这时候既使不设置linger,close也同样会发送rst
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP