Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用TcpServer和TcpClient类,怎么设置心跳间隔? #667

Open
mrclassfree opened this issue Jan 8, 2025 · 3 comments
Open

使用TcpServer和TcpClient类,怎么设置心跳间隔? #667

mrclassfree opened this issue Jan 8, 2025 · 3 comments

Comments

@mrclassfree
Copy link

mrclassfree commented Jan 8, 2025

我是在局域网中使用,我想把心跳间隔时间设置为一个超长的时间,文档中我看到有C调用方式,不知道C++方式如何设置?
现在我的客户端和服务端都没有设置心跳时间,
我现在的场景是: 客户端使用TcpClient,设置了重连策略,服务端使用TcpServer。服务端和客户端都没有使用单独的EventLoop。
客户端如果和服务端长时间没有数据传输, 在服务器上用其他工具查看TCP连接会发现客户端的TCP连接已经不存在了, 服务端TcpServer并没有触发onConnection回调,客户端TcpClient也没有触发onConnection回调,这个时候在客户机使用其他工具查看TCP连接,还能看到连接依然存在。 然后我手动关闭服务端程序,客户端依然没有触发onConnection回调,也没有触发重连动作。

又有新的发现:客户端和服务端最后一次通信时间是17:21,然后再次通信时是22:20,这个时候服务端发送数据给客户端,但是客户端没有接收到,然后服务端就触发了断开连接的回调了。但是客户端还是没有触发断开连接回调,客户端一直认为自己处于正常连接状态。

@ithewei
Copy link
Owner

ithewei commented Jan 9, 2025

设置应用层心跳可以通过channel->setHeartbeat,或者自己起个定时器都可以

@mrclassfree
Copy link
Author

设置应用层心跳可以通过channel->setHeartbeat,或者自己起个定时器都可以

可以通过一下方式来设置心跳吗?
int sock = client_.createsocket(22330, "192.168.1.111");
setsockopt(sock, IPPROTO_TCP, TCP_KEEPIDLE, (char*)&idle, sizeof(idle));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPINTVL, (char*)&interval, sizeof(interval));
setsockopt(sock, IPPROTO_TCP, TCP_KEEPCNT, (char*)&count, sizeof(count));

@ithewei
Copy link
Owner

ithewei commented Jan 9, 2025

setsockopt设置的TCP层协议心跳,你先分别了解下TCP层心跳和应用层心跳的区别和必要性,然后自己决定使用何种方式

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants