socket 断开自动重连

teachin88 2015-08-26 09:25:06
服务器 - 客户端 之间 socket 通信,要做一个断开自动重连的功能。

服务器 -- 客户端 通过 心跳包 检测是否断开, 这个没有问题。


我的问题是:

1: 客户端程序 退出,然后再启动, 然后 创建 socket 然后 connect , 但是, 这个时候 服务器一直在运行,并没有 在 accept 阻塞等待。 但 现象是, connect 竟然能连上(为什么?), 但是 该 socket 数据收发 有问题, 然后 就通过心跳包检测到 连接异常。


2:如果服务器 程序退出, 然后启动, 客户端能检测到 连接异常, 客户端代码 会 重新 connect , 理论 上 等到 服务器运行 到 accept 的时候,就能连上, 但是死活连不上。

3: 有没有 类似 一些 细节上的设置, 比如, 重新连接的话, 是先要 close socket 然后重新创建 socket 还是 可以用原来的 socket

...全文
2171 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
teachin88 2015-08-29
  • 打赏
  • 举报
回复
引用 11 楼 hnwyllmm 的回复:
我是分两种情况的:(前提是我已经有心跳包 正常运行) 1: 服务器 掉电重启, 过一会儿 客户端检测到 失联, 于是 尝试重新连接 (先 shutdown 然后 close(socket), 然后 重新创建 socket 然后 connect) , 因为 服务器 重启,所以服务器 也会进入 accept 状态 (我试过 accept 之前 服务器 也需要 shutdown 和 close 与 客户端 连接的 socket , 否则重连不上 ) 2: 如果 客户端掉电 重启, 应该 怎么处理 比较方便 ? 1. 调用close就不用调用shutdown了,这些知识楼主回头找找资料看下,不过楼主的做法还是可行的 2. 既然客户端可以使用心跳,服务端也一样也有心跳机制检测了吗?
服务器也可以检测心跳,如果失联,也可以检测到。
羽飞 2015-08-28
  • 打赏
  • 举报
回复
我是分两种情况的:(前提是我已经有心跳包 正常运行) 1: 服务器 掉电重启, 过一会儿 客户端检测到 失联, 于是 尝试重新连接 (先 shutdown 然后 close(socket), 然后 重新创建 socket 然后 connect) , 因为 服务器 重启,所以服务器 也会进入 accept 状态 (我试过 accept 之前 服务器 也需要 shutdown 和 close 与 客户端 连接的 socket , 否则重连不上 ) 2: 如果 客户端掉电 重启, 应该 怎么处理 比较方便 ? 1. 调用close就不用调用shutdown了,这些知识楼主回头找找资料看下,不过楼主的做法还是可行的 2. 既然客户端可以使用心跳,服务端也一样也有心跳机制检测了吗?
赵4老师 2015-08-27
  • 打赏
  • 举报
回复
当然是“accept 后 与 客户端 连接的 socket”了。 参考MSDN98中的例子代码。MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix, MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl
teachin88 2015-08-27
  • 打赏
  • 举报
回复
引用 3 楼 hnwyllmm 的回复:
[quote=引用 2 楼 teachin88 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的
也就是说 客户端 connect 重连的时候, 服务器 必须到 accept 状态 ,否则就算连上 也不能正常 通信 是吧?[/quote] 也许对于操作系统来说没有accept也可以正常建立TCP的连接,但是没有accept,这个连接对程序来说是不可用的 [/quote] 这么说,对于 一对一 的 客户端 --服务器 , 服务器也必须 通过 心跳 超时 检测 是否 断开, 如果断开, 服务器必须 跳转到 accept 去 等待连接 ? ps: 服务器 有两个 socket, 一个是 创建 的服务端 socket , 另一个是 accept 后 与 客户端 连接的 socket , 你说 的 shutdown 和 close 是针对哪个socket 的 ?
teachin88 2015-08-27
  • 打赏
  • 举报
回复
引用 9 楼 hnwyllmm 的回复:
[quote=引用 7 楼 teachin88 的回复:] [quote=引用 3 楼 hnwyllmm 的回复:] [quote=引用 2 楼 teachin88 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的
也就是说 客户端 connect 重连的时候, 服务器 必须到 accept 状态 ,否则就算连上 也不能正常 通信 是吧?[/quote] 也许对于操作系统来说没有accept也可以正常建立TCP的连接,但是没有accept,这个连接对程序来说是不可用的 [/quote] 这么说,对于 一对一 的 客户端 --服务器 , 服务器也必须 通过 心跳 超时 检测 是否 断开, 如果断开, 服务器必须 跳转到 accept 去 等待连接 ? ps: 服务器 有两个 socket, 一个是 创建 的服务端 socket , 另一个是 accept 后 与 客户端 连接的 socket , 你说 的 shutdown 和 close 是针对哪个socket 的 ?[/quote] 最好是有心跳机制检测是否客户端已经断开连接,否则如果客户端down机,可能要很久才能知道客户端不在了。 我说的shutdown是客户端的socket,这个动作可以关闭连接,但是close是关闭套接字,虽然它也可能直接调用shutdown[/quote] 我是分两种情况的:(前提是我已经有心跳包 正常运行) 1: 服务器 掉电重启, 过一会儿 客户端检测到 失联, 于是 尝试重新连接 (先 shutdown 然后 close(socket), 然后 重新创建 socket 然后 connect) , 因为 服务器 重启,所以服务器 也会进入 accept 状态 (我试过 accept 之前 服务器 也需要 shutdown 和 close 与 客户端 连接的 socket , 否则重连不上 ) 2: 如果 客户端掉电 重启, 应该 怎么处理 比较方便 ?
赵4老师 2015-08-27
  • 打赏
  • 举报
回复
每次重连请至少间隔10秒。
赵4老师 2015-08-27
  • 打赏
  • 举报
回复
当连接池由于来自某个IP的频繁多次重连被一堆无效连接占满时,需要断开来自该IP的所有连接并清空其相关连接池。
赵4老师 2015-08-27
  • 打赏
  • 举报
回复
判断连接可用的唯一标准是双方各收发一次心跳包。
羽飞 2015-08-27
  • 打赏
  • 举报
回复
引用 2 楼 teachin88 的回复:
[quote=引用 1 楼 hnwyllmm 的回复:] 第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的
也就是说 客户端 connect 重连的时候, 服务器 必须到 accept 状态 ,否则就算连上 也不能正常 通信 是吧?[/quote] 也许对于操作系统来说没有accept也可以正常建立TCP的连接,但是没有accept,这个连接对程序来说是不可用的
teachin88 2015-08-27
  • 打赏
  • 举报
回复
引用 1 楼 hnwyllmm 的回复:
第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的
也就是说 客户端 connect 重连的时候, 服务器 必须到 accept 状态 ,否则就算连上 也不能正常 通信 是吧?
羽飞 2015-08-27
  • 打赏
  • 举报
回复
引用 7 楼 teachin88 的回复:
[quote=引用 3 楼 hnwyllmm 的回复:] [quote=引用 2 楼 teachin88 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的
也就是说 客户端 connect 重连的时候, 服务器 必须到 accept 状态 ,否则就算连上 也不能正常 通信 是吧?[/quote] 也许对于操作系统来说没有accept也可以正常建立TCP的连接,但是没有accept,这个连接对程序来说是不可用的 [/quote] 这么说,对于 一对一 的 客户端 --服务器 , 服务器也必须 通过 心跳 超时 检测 是否 断开, 如果断开, 服务器必须 跳转到 accept 去 等待连接 ? ps: 服务器 有两个 socket, 一个是 创建 的服务端 socket , 另一个是 accept 后 与 客户端 连接的 socket , 你说 的 shutdown 和 close 是针对哪个socket 的 ?[/quote] 最好是有心跳机制检测是否客户端已经断开连接,否则如果客户端down机,可能要很久才能知道客户端不在了。 我说的shutdown是客户端的socket,这个动作可以关闭连接,但是close是关闭套接字,虽然它也可能直接调用shutdown
羽飞 2015-08-26
  • 打赏
  • 举报
回复
第一个 只是连接上,但是服务器端并没有接受这个连接,收发数据肯定有问题吧 第二个,先shutdown关闭连接再调用connect试试 第三个,如果上面那个不行,就close再重连,应该可以的

69,369

社区成员

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

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