有关于socket断线检测和重连问题

yiyefangzhou24 2014-02-20 10:39:12
假如我有个socket连接句柄数组或者就用select的第二个参数的结构体存放
typedef struct fd_set {
 u_int fd_count;
 socket fd_array[FD_SETSIZE];
} fd_set;

现在我想实时检测这些连接句柄是否断线或者断线重连的方法,我没拜读过商业系统关于这个的源码,不知道大牛们是如何做的。我的思路是

1.设置一个定时器,对所有的句柄进行send或者recv根据返回值判断
2.检测到断线后删除并close句柄,客户端重新connect


请教经验丰富的人,一般程序员是如何做的?
...全文
439 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
耿然 2014-02-22
  • 打赏
  • 举报
回复
TCP:搜索异步套接字编程。 UDP:定期心跳包检测。
赵4老师 2014-02-21
  • 打赏
  • 举报
回复
应用层自己定义一个每隔比如30秒收发的心跳包格式及内容。
yiyefangzhou24 2014-02-21
  • 打赏
  • 举报
回复
引用 6 楼 zhao4zhong1 的回复:
应用层自己定义一个每隔比如30秒收发的心跳包格式及内容。
赵老师,时间不能解决纯净性问题吧,再长的时间都有可能在发送心跳的时候有数据传输,而且时间长了,不能保证客户端在线状态的实时性。 我一开始的初衷是想找找微软有没有对应的api能不用发送数据检测连接是否断线,找了好久好像没找到。貌似只能做心跳了,我是想做一个特殊的心跳包格式,以避免混淆正常数据,让服务端在收到这个包时能判断是心跳后更新在线状态后丢弃,请问什么样的格式比较好?
yiyefangzhou24 2014-02-21
  • 打赏
  • 举报
回复
引用 4 楼 zhao4zhong1 的回复:
提醒,控制每次重连的时间间隔!
间隔设定是10秒,这个好像多数的方法都是释放后重连,这没问题,主要是服务器的断线检测问题,不知道怎么做最优
赵4老师 2014-02-21
  • 打赏
  • 举报
回复
提醒,控制每次重连的时间间隔!
yiyefangzhou24 2014-02-21
  • 打赏
  • 举报
回复
引用 2 楼 ovoovo 的回复:
让客户端定时发心跳。 如果服务端接收心跳超时,则认为断开,删除客户端信息。
这个就是我说的那个第一条吧? 1.设置一个定时器,对所有的句柄进行send或者recv根据返回值判断 这么做一个是做tcp的心跳的话效率低而且难以保证正常数据传输的纯净性,还要做个检测器,检测是不是当前句柄在传输数据停掉心跳,有没有更简单稳定的方法?
  • 打赏
  • 举报
回复
让客户端定时发心跳。 如果服务端接收心跳超时,则认为断开,删除客户端信息。
yiyefangzhou24 2014-02-21
  • 打赏
  • 举报
回复

64,642

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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