user-0 提问: socket 断开自动重连

回复:
user: user-0
content: 引用 11 楼 hnwyllmm 的回复:我是分两种情况的：（前提是我已经有心跳包 正常运行）  1： 服务器 掉电重启， 过一会儿 客户端检测到 失联， 于是 尝试重新连接 （先 shutdown  然后  close（socket）， 然后 重新创建 socket  然后  connect）  ，  因为 服务器 重启，所以服务器 也会进入  accept 状态 （我试过 accept 之前 服务器 也需要 shutdown   和  close  与 客户端 连接的 socket ，  否则重连不上 ）   2： 如果 客户端掉电 重启，  应该 怎么处理 比较方便 ？     1. 调用close就不用调用shutdown了，这些知识楼主回头找找资料看下，不过楼主的做法还是可行的 2. 既然客户端可以使用心跳，服务端也一样也有心跳机制检测了吗？   服务器也可以检测心跳，如果失联，也可以检测到。

user: user-1
content: 我是分两种情况的：（前提是我已经有心跳包 正常运行）  1： 服务器 掉电重启， 过一会儿 客户端检测到 失联， 于是 尝试重新连接 （先 shutdown  然后  close（socket）， 然后 重新创建 socket  然后  connect）  ，  因为 服务器 重启，所以服务器 也会进入  accept 状态 （我试过 accept 之前 服务器 也需要 shutdown   和  close  与 客户端 连接的 socket ，  否则重连不上 ）   2： 如果 客户端掉电 重启，  应该 怎么处理 比较方便 ？     1. 调用close就不用调用shutdown了，这些知识楼主回头找找资料看下，不过楼主的做法还是可行的 2. 既然客户端可以使用心跳，服务端也一样也有心跳机制检测了吗？

user: user-2
content: 当然是“accept 后 与 客户端 连接的 socket”了。 参考MSDN98中的例子代码。MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

user: user-0
content: 引用 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 的 ？

user: user-0
content: 引用 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： 如果 客户端掉电 重启，  应该 怎么处理 比较方便 ？

user: user-2
content: 每次重连请至少间隔10秒。

user: user-2
content: 当连接池由于来自某个IP的频繁多次重连被一堆无效连接占满时，需要断开来自该IP的所有连接并清空其相关连接池。

user: user-2
content: 判断连接可用的唯一标准是双方各收发一次心跳包。

user: user-1
content: 引用 2 楼 teachin88 的回复:[quote=引用 1 楼 hnwyllmm 的回复:] 第一个 只是连接上，但是服务器端并没有接受这个连接，收发数据肯定有问题吧 第二个，先shutdown关闭连接再调用connect试试 第三个，如果上面那个不行，就close再重连，应该可以的   也就是说 客户端 connect 重连的时候，  服务器 必须到  accept 状态 ，否则就算连上 也不能正常 通信 是吧？[/quote]  也许对于操作系统来说没有accept也可以正常建立TCP的连接，但是没有accept，这个连接对程序来说是不可用的

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:第一个 只是连接上，但是服务器端并没有接受这个连接，收发数据肯定有问题吧 第二个，先shutdown关闭连接再调用connect试试 第三个，如果上面那个不行，就close再重连，应该可以的   也就是说 客户端 connect 重连的时候，  服务器 必须到  accept 状态 ，否则就算连上 也不能正常 通信 是吧？

user: user-1
content: 引用 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

user: user-1
content: 第一个 只是连接上，但是服务器端并没有接受这个连接，收发数据肯定有问题吧 第二个，先shutdown关闭连接再调用connect试试 第三个，如果上面那个不行，就close再重连，应该可以的