Ale*_*lex 8 c++ sockets heartbeat
嘿帮派.我刚刚使用sys/socket在C++中编写了一个客户端和服务器.我需要处理客户端仍处于活动状态但服务器已关闭的情况.建议的方法之一是使用心跳来定期断言连接.如果没有尝试在Y时间段内每隔X秒重新连接一次,那么就超时了.
这种"心跳"是检查连接的最佳方式吗?
我正在使用的套接字可能有关于它的信息,有没有办法检查是否存在连接而没有弄乱缓冲区?
Com*_*ger 12
如果您通过IP网络使用TCP套接字,则可以使用TCP协议的keepalive功能,该功能将定期检查套接字以确保另一端仍然存在.(这还有一个优点,即保持套接字的转发记录在客户端和服务器之间的任何NAT路由器中都有效.)
这是一个TCP keepalive概述,其中概述了您可能希望使用TCP keepalive的一些原因; 这个特定于Linux的HOWTO描述了如何配置套接字以在运行时使用TCP keepalive.
看起来您可以通过SIO_KEEPALIVE_VALS
使用WSAIoctl()函数进行设置来启用Windows套接字中的TCP keepalive .
如果您在IP上使用UDP套接字,则需要在协议中构建自己的心跳.
是的,这种心跳是最好的方式。您必须将其构建到服务器和客户端用于通信的协议中。
最简单的解决方案是让客户端定期发送数据,如果服务器在特定时间段内没有收到来自客户端的任何数据,则服务器关闭连接。这适用于客户端发送查询和服务器发送响应的查询/响应协议。
例如,您可以使用以下方案:
服务器响应每个查询。如果服务器在两分钟内没有收到查询,它将关闭连接。
客户端发送查询并在每个查询之后保持连接打开。
如果客户端有一分钟没有发送查询,它会发送一个“你在那里”的查询。服务器响应“是的,我是”。这将重置服务器的两分钟计时器并向客户端确认连接仍然可用。
如果过去一分钟不需要发送查询,让客户端关闭连接可能会更简单。由于所有操作都是由客户端发起的,如果需要执行新的操作,它总是可以只打开一个新的连接。这将其简化为:
如果服务器在两分钟内没有收到查询,则关闭连接。
如果客户端在一分钟内不需要发送查询,则关闭连接。
但是,这并不能向客户端保证服务器始终存在并准备好接受查询。如果您需要此功能,您将必须在您的协议中实现“你在那里”“是的,我在”的查询/响应。
归档时间: |
|
查看次数: |
14604 次 |
最近记录: |