免费注册 查看新帖 |

Chinaunix

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

TCP RST 问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-07 19:37 |只看该作者 |倒序浏览
最近写了一个测试用的服务器,非常简单,流程如下:监听端口,接受连接,发送数据,关闭socket

但是客户端总是收到Connection reset by peer 的错误

获取send的返回值,根据返回值进行循环发送不解决问题
设置socket的linger属性也不解决问题

后来发现是因为服务器没有读客户端发送的数据,如果将服务器改成如下:监听端口,接受连接,读客户端请求,发送数据,关闭socket
则没有问题。

想请教一下:
如果socket在关闭的时候,还有数据在读缓存里,会发送rst包? 这个的规定在哪里可以查阅?谢谢

论坛徽章:
0
2 [报告]
发表于 2009-04-07 19:46 |只看该作者
原帖由 tianqio 于 2009-4-7 19:37 发表
最近写了一个测试用的服务器,非常简单,流程如下:监听端口,接受连接,发送数据,关闭socket

但是客户端总是收到Connection reset by peer 的错误

获取send的返回值,根据返回值进行循环发送不解决问题 ...



没有修改的那个是你的server接受连接后,发完马上关了,然后在你的server上,这个连接已经不存在了

在你的client那边,它的连接刚刚被接受,大概还没有来得及发东西的时候,server已经把这条连接down掉了
然后client发过去的时候,server检测到client在向一个不存在的连接发东西,这样就发rst了

你好好感觉一下 ,呵呵

论坛徽章:
0
3 [报告]
发表于 2009-04-07 20:10 |只看该作者
原帖由 astezheng 于 2009-4-7 19:46 发表



没有修改的那个是你的server接受连接后,发完马上关了,然后在你的server上,这个连接已经不存在了

在你的client那边,它的连接刚刚被接受,大概还没有来得及发东西的时候,server已经把这条连接down掉 ...


我在代码里将server接收连接后,加上sleep 2s,然后在发送数据,客户端是用wget,可以看到wget connect上后有停顿,然后开始接收数据,这样依然会收到rst,所以问题不是client写的时候server已经将socket关闭了,这样client写的时候就会有broken pipe的错误,而不是rst的错误,但如果加上读客户端数据的代码,就一切ok

论坛徽章:
0
4 [报告]
发表于 2009-04-07 20:25 |只看该作者
抓包看看有什么异常

论坛徽章:
0
5 [报告]
发表于 2009-04-07 21:00 |只看该作者
tcp rfc 摘录如下:
            A host MAY implement a "half-duplex" TCP close sequence, so
            that an application that has called CLOSE cannot continue to
            read data from the connection.  If such a host issues a
            CLOSE call while received data is still pending in TCP, or
            if new data is received after CLOSE is called, its TCP
            SHOULD send a RST to show that data was lost.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP