免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-08-22 11:41 |只看该作者 |倒序浏览
本人在做web服务器的文件上传功能。我先解析IE发过来的头,发现上传的文件内容太大,于是我就不接受此次上传。我就close此socket,但由于此socket,读缓冲区还有数据,导致close操作 发送给IE一个rst信令而非fin。IE网页采用POST上传的、这样就会出现空白页面。

要解决这个问题 办法 1 是 发现文件太大了 仍然socket 接收,但不写入磁盘。 但这样太慢了。
                    2 发现文件太大。shutdown 关闭socket 读缓冲区,清楚读缓冲区, 再关闭写缓冲期
                       但 怎么清空读缓冲区呢?????????????

                     3  大家有没有好的处理办法?


论坛徽章:
0
2 [报告]
发表于 2013-08-22 12:06 |只看该作者
sf and up

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
3 [报告]
发表于 2013-08-22 12:16 |只看该作者
XZisonsun 发表于 2013-08-22 11:41
本人在做web服务器的文件上传功能。我先解析IE发过来的头,发现上传的文件内容太大,于是我就不接受此次上传 ...

linger......................

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-08-22 12:46 |只看该作者
回复 3# yulihua49


    mark,楼上说的详细点呢,把linger设置成多少?

论坛徽章:
0
5 [报告]
发表于 2013-08-22 13:36 |只看该作者
回复 3# yulihua49


    那个是针对发送吧?

我这个是接收。。。

论坛徽章:
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
6 [报告]
发表于 2013-08-22 14:33 |只看该作者
回复 1# XZisonsun


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

论坛徽章:
0
7 [报告]
发表于 2013-08-22 17:02 |只看该作者
本帖最后由 yxw-yxw 于 2013-08-22 17:03 编辑

ie 出现空白页面是因为你没有往 IE 发送数据就close了。

要达到你的要求,可以在检查到文件太大的时候(分析 http 头后),不用read(或是recv),直接往连接socket write(或是send)数据(错误消息之类的),然后close socket。close掉连接socket后,内核不再保留与之关联的缓冲区

论坛徽章:
0
8 [报告]
发表于 2013-08-23 21:59 |只看该作者
XZisonsun 发表于 2013-08-22 11:41
本人在做web服务器的文件上传功能。我先解析IE发过来的头,发现上传的文件内容太大,于是我就不接受此次上传 ...


close()正常需要执行四次握手,它不会发RST,而是FIN,只有之前发的数据已经被收到,peer才会收到FIN。

论坛徽章:
7
天蝎座
日期:2013-09-28 10:45:42双子座
日期:2013-10-16 16:27:09射手座
日期:2013-10-23 10:21:32处女座
日期:2014-09-17 16:44:332015年亚洲杯之巴林
日期:2015-04-09 17:28:01冥斗士
日期:2015-11-26 16:19:0015-16赛季CBA联赛之山东
日期:2018-03-02 23:59:31
9 [报告]
发表于 2013-08-24 02:13 |只看该作者
Aquester 发表于 2013-08-23 21:59
close()正常需要执行四次握手,它不会发RST,而是FIN,只有之前发的数据已经被收到,peer才会收到FIN。


对,close需要四次握手,并且会发送fin。 不会发送rst。


------------------------------
linger是针对发送的,不是针对接收的。

rst的发送条件有几样
1.客户端向服务器不存在的端口发送请求,会收到服务器的icmp不可达消息,tcp使用rst复位。
2.正常终止连接的方式是发送fin,但是可以设置lingger,来使用发送rst异常终止一个连接。
3.用于半打开链接。

论坛徽章:
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
10 [报告]
发表于 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP