recv返回0优雅的中断

冉航--小虾米 2010-11-15 10:52:51
socket API 函数 recv经常返回 0,查了一下MSDN,说是优雅的中断。

请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.
...全文
1242 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
oyster2008 2010-11-20
  • 打赏
  • 举报
回复
数据需要你自己重传
你必须要处理这种情况,即使你现在知道连接没有断掉,也不排除在数据发出去的同时服务器把你的连接给掐掉了
[Quote=引用 9 楼 gaoxiaoweiandy 的回复:]

重新connect的话,但是数据会重传吗? 我必须得重新发送请求数据给服务端,然后才能得到反馈。
[/Quote]
冉航--小虾米 2010-11-16
  • 打赏
  • 举报
回复
重新connect的话,但是数据会重传吗? 我必须得重新发送请求数据给服务端,然后才能得到反馈。
oyster2008 2010-11-15
  • 打赏
  • 举报
回复
返回0并不是错误,只是一种数据流结束的标志
[Quote=引用楼主 gaoxiaoweiandy 的回复:]
socket API 函数 recv经常返回 0,查了一下MSDN,说是优雅的中断。

请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.
[/Quote]
  • 打赏
  • 举报
回复
[Quote=引用楼主 gaoxiaoweiandy 的回复:]
socket API 函数 recv经常返回 0,查了一下MSDN,说是优雅的中断。

请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.
[/Quote]

只有一个问题,为何要避免这个错误。
本来就是用recv返回0来判断连接是否中断,这样对你有影响么,就算用心跳包什么的,原理还是一样啊。
zhutianjin4355255 2010-11-15
  • 打赏
  • 举报
回复
采用中断disable
ouyh12345 2010-11-15
  • 打赏
  • 举报
回复
什么叫优雅的中断?
东东 2010-11-15
  • 打赏
  • 举报
回复
这个好像有点偏激了吧。当你收到recv为0时,你可以直接关闭这个连接,然后再重新connect不就可以了吗。
冉航--小虾米 2010-11-15
  • 打赏
  • 举报
回复
recv返回0对我有影响,因为我在send 之后 就调用recv ,recv返回的数据与业务有关,比较重要。
冉航--小虾米 2010-11-15
  • 打赏
  • 举报
回复
服务端程序 固然可以 变成长连接,也就是说 当客户端与服务端 交互状态处于空闲时,比如长达5分钟。服务端就会主动关闭连接,这样可以减轻服务端的压力。如果服务端变成长连接的话,估计服务端连接数压力比较大。
冉航--小虾米 2010-11-15
  • 打赏
  • 举报
回复
恩。我最后查了一下,是因为服务端关闭了套接字,才导致这边recv返回0。

最后观察了,原来问题是这样的:当客户端不与服务端交互数据好长时间之后,服务端程序会自动断开连接,
同时客户端的连接状态变成了 CLOSE_WAIT.(我用NETSTAT-NA命令查看)。 变成了CLOSE_WAIT之后,如果客户端再向服务端发送数据,然后recv服务端的反馈时,就会造成recv返回0。



我现在的想法是: 在recv之前,调用一个API函数判断连接是否还正常,如果正常,再调用recv.
问题是,即使你在recv之前判断连接为正常,但是也有可能在调用recv的瞬间对方关闭了连接,最终导致recv还是返回0,不知道我说的对不对?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧