请教下,在非阻塞模式下send的问题?

fdl19881 2012-04-29 05:42:20
情况是这样的:
服务器端和客户端都使用的非阻塞模式的tcp连接。
服务器端会一直给客户端发送数据(传流媒体),但是客户端不会回发数据。
我的问题是:非阻塞模式下的TCP socket ,
当网络连接中断了的时候 ,我能不能通过发送数据不成功来获得这个情况呢?
(因为如果网络断开了,那么服务器发送出去的数据就没法被客户端确定,然后服务器可能会一直重传?)
比如下次服务器端发送数据前,调用getsockopt SO_ERROR 来获得错误的原因,从而断定网络出问题了。
为了增加可靠性,可以假设比如连续多少次在发送前调用getsockopt SO_ERROR都返回错误,那么就认为网络已经中断了。

这样是不是就可以不用心跳呢?

还有那个select的第三个集合exception , 这个是指发生哪些事件的时候,出现呢?

谢谢各位了。
...全文
307 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
fdl19881 2012-05-03
  • 打赏
  • 举报
回复
好吧,看来是只能这样子了.
谢谢LZ各位的耐心回复,现在结帖,,我还是用心跳来解决吧.
[Quote=引用 5 楼 的回复:]

非正常断开需要用心跳机制来解决
[/Quote]
fdl19881 2012-05-03
  • 打赏
  • 举报
回复
客户端好检测连接是否断开,,但是服务器端有没有可能在非阻塞send的情况下,检测到发送没成功呢?
[Quote=引用 7 楼 的回复:]

如果考虑二次开发的话,为使用者方便,视频传输真的不用心跳,
每秒统计一下发送或接收字节总数,如果连续若干秒总和为0,视为断开

一个极端的例子,比如你要为一个网络接口的相机开发程序,目的是让下游开发人员使用这个相机,视频传输这个连接完全可以不用心跳
[/Quote]
百事烟 2012-05-02
  • 打赏
  • 举报
回复
服务器端会一直给客户端发送数据(传流媒体),
如果一直,则不用心跳包

但如果客户端有控制功能,通常做法是另开一个连接,如果这个连接并非一直,如果有这个连接,必须有心跳功能或其它措施,比如开通30秒后自动断开
「已注销」 2012-05-02
  • 打赏
  • 举报
回复
因为是非阻塞模式,可以依靠select函数来判断超时,如果超时则可以判定为连接失效。
fishion 2012-05-02
  • 打赏
  • 举报
回复
心跳包才是比较好的方法
百事烟 2012-05-02
  • 打赏
  • 举报
回复
视频传输有点特殊,如果每秒帧数过少(数据量过少),就不叫视频传输了,要重新考虑软件硬件搭配
百事烟 2012-05-02
  • 打赏
  • 举报
回复
如果考虑二次开发的话,为使用者方便,视频传输真的不用心跳,
每秒统计一下发送或接收字节总数,如果连续若干秒总和为0,视为断开

一个极端的例子,比如你要为一个网络接口的相机开发程序,目的是让下游开发人员使用这个相机,视频传输这个连接完全可以不用心跳
jwybobo2007 2012-05-02
  • 打赏
  • 举报
回复
情况是这样的:
服务器端和客户端都使用的非阻塞模式的tcp连接。
服务器端会一直给客户端发送数据(传流媒体),但是客户端不会回发数据。
我的问题是:非阻塞模式下的TCP socket ,
当网络连接中断了的时候 ,我能不能通过发送数据不成功来获得这个情况呢?
可以
(因为如果网络断开了,那么服务器发送出去的数据就没法被客户端确定,然后服务器可能会一直重传?)
比如下次服务器端发送数据前,调用getsockopt SO_ERROR 来获得错误的原因,从而断定网络出问题了。
为了增加可靠性,可以假设比如连续多少次在发送前调用getsockopt SO_ERROR都返回错误,那么就认为网络已经中断了。

这样是不是就可以不用心跳呢?
调用getsockopt是多此一举,正常情况下,如果调用非阻塞发送多次了,可能send直接返回说有错误,另外你的recv可能会返回说有错误,两种情况下都去获取错误号判断即可。

还有那个select的第三个集合exception , 这个是指发生哪些事件的时候,出现呢?
OOB数据到达,或者出现了异常错误,这些错误基本就是socket能产生的那些了

谢谢各位了。


总结还是用心跳,这个已经是惯例了,不用想着回避,它是一种常态,必须实现
Eleven 2012-05-02
  • 打赏
  • 举报
回复
非正常断开需要用心跳机制来解决
fdl19881 2012-05-02
  • 打赏
  • 举报
回复
我的意思是说,服务器端是一直给客户端发数据,但是客户端却不给服务器端发数据。
这种情况下,服务器端能不能通过getsockopt SO_ERROR 的功能得到这个socket已经断开了呢?

我已经通过客户端定时间隔给服务器商发数据解决了这个问题了。 只是想弄清楚上面说的在非阻塞的情况下,只有TCP socket只有单向数据流的情况下, 服务器端能否检测到连接是否已经断开? (比如网络中断的情况)

[Quote=引用 3 楼 的回复:]

服务器端会一直给客户端发送数据(传流媒体),
如果一直,则不用心跳包

但如果客户端有控制功能,通常做法是另开一个连接,如果这个连接并非一直,如果有这个连接,必须有心跳功能或其它措施,比如开通30秒后自动断开
[/Quote]

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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