社区
C语言
帖子详情
recv返回0优雅的中断
冉航--小虾米
2010-11-15 10:52:51
socket API 函数 recv经常返回 0,查了一下MSDN,说是优雅的中断。
请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.
...全文
1242
10
打赏
收藏
recv返回0优雅的中断
socket API 函数 recv经常返回 0,查了一下MSDN,说是优雅的中断。 请问这种错误如何避免。是否要在 recv之前,判定连接是否中断,如果未中断则recv.
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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]
猫已经找不回了
2010-11-15
打赏
举报
回复
[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,不知道我说的对不对?
recv
函数说明
返回
值
客户端的程序连接上服务器后
recv
函数阻塞接受,有时会
返回
0,说明接收超时服务器主动断开了连接,需要重新connect服务器,但重新connect时会报“Transport endpoint is already connected”!!!
返回
0时正确处理...
深入理解socket中的
recv
函数和send函数
一、函数原型 **·**
recv
函数用于socket通信中接收消息,接口定义如下: ssize_t
recv
(int socket, void *buf, size_t len, int ...成功时,
返回
值是
返回
接收数据的长度。 **·**send函数用于socket通信中发送消息,
TCP之send &
recv
接触过网络开发的人,大抵都知道,上层应用使用send函数发送数据,使用
recv
来接收数据,而send和
recv
的实现原理又是怎样的呢? 在前面的几篇文章中,我们有提过,TCP是个可靠的、全双工协议。其流量控制或者拥塞...
C函数篇(
recv
函数)
简述 从一个套接口接收数据。 表头文件: ...int PASCAL FAR
recv
( SOCKET s, char FAR* buf, int len, int flags); s:一个标识已连接套接口的描述字。 buf:用于接收数据的缓冲区。 len:缓冲区...
socket api中send()和
recv
()函数工作
send()和
recv
()函数是网络编程中经常使用到的函数,下面详细的比较两者的不同之处 send函数工作原理: send函数只负责将数据提交给协议层。 当调用该函数时,send先比较待发送数据的长度len和套接字s的发送缓冲区的...
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章