TCP客户端服务器端断开的消息响应及自动重连

whirlrain9 2010-09-27 10:25:33
那位大哥有这方面的源码啊,简单的demo就行,我找了好多资料都没找到,我用的是阻塞式的,当socket的正常断开或意外断开,都可以通过消息响应及时的自动重连
...全文
1594 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackson35296 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 muzizongheng 的回复:]
引用 4 楼 jackson35296 的回复:
引用 3 楼 lijianli9 的回复:
异常断开肯定是要用心跳包的形式来知道的了,


有没有写过网络编程?断开后操作系统会告诉你,你查询套接字的状态会得到异常,或者当发现函数失败WSAGetLastError的时候也会得到内核的通知。


一看你就不专业。
[/Quote]

我写TCP编程也写了不少,断线重连也搞过,从来不用心跳,UDP和B/S编程才用到过
傻X 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mayudong1 的回复:]
问个问题啊
如果tcp连接建立好了,很长时间不发送数据,连接依然能保持
如果这个时候把网线断开,过段时间再插上,这个时候那个连接还存在吗?还能继续通讯吗?
[/Quote]

我记得貌似是不能的,你的SOCKET句柄被破坏了。
傻X 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 muzizongheng 的回复:]
引用 4 楼 jackson35296 的回复:
引用 3 楼 lijianli9 的回复:
异常断开肯定是要用心跳包的形式来知道的了,


有没有写过网络编程?断开后操作系统会告诉你,你查询套接字的状态会得到异常,或者当发现函数失败WSAGetLastError的时候也会得到内核的通知。


一看你就不专业。
[/Quote]

顶木子哥
czh604 2010-09-29
  • 打赏
  • 举报
回复
一般是要心跳的。
有些连接不是实时的在发数据,有可能连接出现空闲,这时网络突然出现异常断开,服务器是监测不到的。
这样就需要一个额外的心跳连接来定时判断客户端是否处于连接状态。
心跳连接:一般是客户来定时给服务器发个心跳包(小数据包),服务器接收到返回一个相对应的心跳包。
客户端内实时的判断心跳连接是否断开(服务器正常或异常断开都会导致心跳套接字接收不到数据包),来重启连接。
Eleven 2010-09-29
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 mayudong1 的回复:]
问个问题啊
如果tcp连接建立好了,很长时间不发送数据,连接依然能保持
如果这个时候把网线断开,过段时间再插上,这个时候那个连接还存在吗?还能继续通讯吗?
[/Quote]
不能,需要重新建立连接,三次握手
mayudong1 2010-09-29
  • 打赏
  • 举报
回复
问个问题啊
如果tcp连接建立好了,很长时间不发送数据,连接依然能保持
如果这个时候把网线断开,过段时间再插上,这个时候那个连接还存在吗?还能继续通讯吗?
jwybobo2007 2010-09-28
  • 打赏
  • 举报
回复
异常断开,需要程序员自己处理,比如直接拔网线,或者突然断电等等,还有就是程序级别的服务端挂掉等,需要自己的逻辑处理,如心跳机制等,可自己实现,或者使用Windows或者Unix下的特殊API处理,如WSAIoctl
【天运子】 2010-09-28
  • 打赏
  • 举报
回复
他说的是异常
jackson35296 2010-09-28
  • 打赏
  • 举报
回复
B/S编程和UDP编程时才用到心跳。比如定期向web服务器发一个request证明自己在线。http协议是请求一下就断开了,每次都要重新连接,重新请求,这种情况下才有必要用心跳机制。一般的TCP通信都是长连接,不可能频繁连接和断开。对于长期保持连接的情况,一旦断开,操作系统底层都会通知你,你需要解决的是如何获取到系统的通知。
jackson35296 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lijianli9 的回复:]
异常断开肯定是要用心跳包的形式来知道的了,
[/Quote]

有没有写过网络编程?断开后操作系统会告诉你,你查询套接字的状态会得到异常,或者当发现函数失败WSAGetLastError的时候也会得到内核的通知。
lijianli9 2010-09-28
  • 打赏
  • 举报
回复
异常断开肯定是要用心跳包的形式来知道的了,
jackson35296 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 muzizongheng 的回复:]
发送心跳包, 失败就重连。
[/Quote]

TCP还用整心跳?
阻塞模式下, recv函数返回-1就说明网络断开了,然后就可以重连;非阻塞模式下,根据WSAGetLastError()的值来判断网络断开
muzizongheng 2010-09-28
  • 打赏
  • 举报
回复
发送心跳包, 失败就重连。
muzizongheng 2010-09-28
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jackson35296 的回复:]
引用 3 楼 lijianli9 的回复:
异常断开肯定是要用心跳包的形式来知道的了,


有没有写过网络编程?断开后操作系统会告诉你,你查询套接字的状态会得到异常,或者当发现函数失败WSAGetLastError的时候也会得到内核的通知。
[/Quote]

一看你就不专业。
zhaohongbo83 2010-09-28
  • 打赏
  • 举报
回复
// 发送回应消息
int nSend = Send4IntMsg(sock, (char*)(LPCTSTR)strSendBuf, strSendBuf.GetLength(), errMsg);
if (nSend < 0) // 发送消息失败
closesocket(sock);
重新连接就可以了

这个在一个线程里,循环检测就OK了!

18,356

社区成员

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

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