socket 断开自动重连

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

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


我的问题是:

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


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

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

...全文
2251 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用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再重连,应该可以的

70,021

社区成员

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

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