社区
Linux/Unix社区
帖子详情
如何不用心跳包检测TCP连接断开
frank529
2012-05-17 10:27:07
TCP keepalive不行,因为必须socket长时间没有收发数据才会发keepalive包,而我的程序有可能一直在发数据。TCP有个超时重传机制,应该是可以通过重传多次失败知道连接断开的,但是不知道应用层如何获取连接断开的信息?还请高人指点
...全文
588
9
打赏
收藏
如何不用心跳包检测TCP连接断开
TCP keepalive不行,因为必须socket长时间没有收发数据才会发keepalive包,而我的程序有可能一直在发数据。TCP有个超时重传机制,应该是可以通过重传多次失败知道连接断开的,但是不知道应用层如何获取连接断开的信息?还请高人指点
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
开发者说
2012-05-17
打赏
举报
回复
直接close掉socket
qq120848369
2012-05-17
打赏
举报
回复
[Quote=引用 8 楼 的回复:]
引用 7 楼 的回复:
还有,我觉得你混淆了一个概念, 即便是阻塞接口也不是等待ACK之后send才返回的。服务端唯一能做的就是正常的时候发送数据,失败的时候关闭socket,其他的都无法保证。逻辑必须做在客户端。
现在问题就是我怎么知道数据发出去对端有没有ACK?网络断连了,进行send、select返回值都是正常的,这个你可以写个程序测试下。
[/Quote]
我不是说了吗? 服务端没法保证,服务端只会在发送之后某一刻接受到ACK或者RST,那么close就行了。
只有客户端知道自己接受了多少数据,逻辑是做在客户端的。服务端只知道你连接上来,你要多少偏移量开始的数据,然后就开始发,TCP保证数据可靠,足够了。至于服务器到底发出去多少,服务器不care,客户端care。
frank529
2012-05-17
打赏
举报
回复
[Quote=引用 7 楼 的回复:]
还有,我觉得你混淆了一个概念, 即便是阻塞接口也不是等待ACK之后send才返回的。服务端唯一能做的就是正常的时候发送数据,失败的时候关闭socket,其他的都无法保证。逻辑必须做在客户端。
[/Quote]
现在问题就是我怎么知道数据发出去对端有没有ACK?网络断连了,进行send、select返回值都是正常的,这个你可以写个程序测试下。
qq120848369
2012-05-17
打赏
举报
回复
还有,我觉得你混淆了一个概念, 即便是阻塞接口也不是等待ACK之后send才返回的。服务端唯一能做的就是正常的时候发送数据,失败的时候关闭socket,其他的都无法保证。逻辑必须做在客户端。
qq120848369
2012-05-17
打赏
举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
引用 3 楼 的回复:
引用 2 楼 的回复:
向客户端写失败就踢掉客户端。
客户端需要有重连逻辑。
TCP keepalive你还是忘掉吧,它与我们毫无关系。
非阻塞写网络断连也不会失败
你检查返回值了?
对端不ACK你怎么会成功?
调用send肯定要判断返回值啊,非阻塞send只要缓冲区没满返回就是正确,不管有没……
[/Quote]
非阻塞不代表就没有ACK了,你非阻塞返回了,数据已经出去了,对端回复RST将会导致你的socket可读或者出错,都可以select监听的到,意识到错误就踢掉客户端.
客户端应该自己控制已接受数据量, 下一次上线向服务器请求断点续传, 服务器是没法记录这个已发送量的, 客户端实际拿到的才是真实的.
frank529
2012-05-17
打赏
举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:
引用 2 楼 的回复:
向客户端写失败就踢掉客户端。
客户端需要有重连逻辑。
TCP keepalive你还是忘掉吧,它与我们毫无关系。
非阻塞写网络断连也不会失败
你检查返回值了?
对端不ACK你怎么会成功?
[/Quote]
调用send肯定要判断返回值啊,非阻塞send只要缓冲区没满返回就是正确,不管有没有收到ACK
qq120848369
2012-05-17
打赏
举报
回复
[Quote=引用 3 楼 的回复:]
引用 2 楼 的回复:
向客户端写失败就踢掉客户端。
客户端需要有重连逻辑。
TCP keepalive你还是忘掉吧,它与我们毫无关系。
非阻塞写网络断连也不会失败
[/Quote]
你检查返回值了?
对端不ACK你怎么会成功?
frank529
2012-05-17
打赏
举报
回复
[Quote=引用 2 楼 的回复:]
向客户端写失败就踢掉客户端。
客户端需要有重连逻辑。
TCP keepalive你还是忘掉吧,它与我们毫无关系。
[/Quote]
非阻塞写网络断连也不会失败
qq120848369
2012-05-17
打赏
举报
回复
向客户端写失败就踢掉客户端。
客户端需要有重连逻辑。
TCP keepalive你还是忘掉吧,它与我们毫无关系。
Delphi之TClientSocket和TServerSocket进行
TCP
长
连接
通讯使用KeepAlive自动发送
心跳包
检测
断网
Delphi之TClientSocket和TServerSocket进行
TCP
长
连接
通讯,使用KeepALive自动发送
心跳包
检测
断网,并实现断线重连,经测试可以及时
检测
到拔掉网线断网情况,具有较高的参考价值
C#中 怎么
检测
Tcp
网线
断开
?
在 C# 中,如果使用
Tcp
Client 或
Tcp
Listener 这样的套接字进行...这样,操作系统将自动发送
心跳包
,以
检测
连接
的活跃性。当使用 C# 进行
TCP
连接
时,下面是一些示例代码,演示如何使用各种方法来
检测
连接
是否
断开
。
任鸟飞逆向分析基础教程
PS: 课程中工具包、源码、课件请关注第一章的第一节的随课课件,工欲望善其事,必先利其器! 【学前预备知识】 仅需基础的编程与程序知识,无则参考基础篇CSDN学院链接:...
java如何处理
tcp
异常
断开
_(转)
TCP
连接
异常
断开
检测
TCP
是一种面向
连接
的协议,
连接
的建立和
断开
需要通过收发相应的分节来实现。某些时候,由于网络的故障或是一方主机的突然崩溃而另一方无法
检测
到,以致始终保持着不存在的
连接
。下面介绍一种方法来
检测
这种异常
断开
...
linux
断开
端口上的
tcp
连接
,Linux
检测
TCP
连接
断开
的一种简单实现方法
问题:Linux中开一个
TCP
套节字(客户端),不断读取对端(服务器)的数据,如果对端没有数据可读,认为是...一般可以采取业务层的心跳
检测
,超时没有收到
心跳包
,就认为是对端已经
断开
,还有些更高级的方法比如KeepAl...
Linux/Unix社区
23,121
社区成员
74,508
社区内容
发帖
与我相关
我的任务
Linux/Unix社区
Linux/Unix社区 应用程序开发区
复制链接
扫一扫
分享
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章