与TCP没有任何KeepAlive()方法的持久双工

问题描述:

我需要实现持久的TCP双工连接事件通知。客户端注册事件和服务器通知所有订户此事件。与TCP没有任何KeepAlive()方法的持久双工

问题是,TCP连接在10分钟后关闭。我知道可靠的会议。关闭和不活动超时。

我需要的是在客户端和服务器之间实现某种“始终打开的连接”。一旦发现连接丢失,客户端立即重新连接。但在与TCP连接时很难注意到某些连接丢失。

我能够发明一种长时间接收和不活动超时的解决方案。如果客户端仍在线并使用某种KeepAlive()方法进行连接,则会在短时间间隔内“侦测”服务器。

我想在我的服务合同上没有KeepAlive()方法的解决方案。

任何想法?

// Miro

+0

如何确定您的连接在没有KeepAlive的情况下仍然打开? – 2011-05-17 14:17:48

+0

多数民众赞成我在问:) – 2011-05-17 14:34:01

+0

你不能。在没有明确的“关闭”数据包的情况下,查明连接是否仍然打开的唯一方法是发送数据。 TCP可以重新发送旧数据,这些旧数据将被确认但被忽略 - 这就是所谓的保持活动状态。 – 2012-10-04 14:58:20

TCP连接本身并不关闭;他们要么明确关闭,要么其中一个终点已经消失。 (注意:终点可以是中间的透明代理或有状态路由器。)我经常运行TCP连接,即使没有保持活动状态,也可以保持好几天甚至几个月。

在前者的情况下,明确的关闭会得到你方通知,但听起来好像是没有发生。

在消失终点的情况下,发送的数据是要找出如果对方已经消失,并保持有效的唯一办法是做了透明的方式。

int delay = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPIDLE,&delay,sizeof(delay)); 
int count = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPCNT,&count,sizeof(count)); 
int interval = X; setsockopt(sockfd,SOL_TCP,TCP_KEEPINTVL,&interval,sizeof(interval)); 
int enable = 1; setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&enable,sizeof(enable)); 

如果你不想使用TCP的保活,那么你需要真实的数据发送到服务器定期或发现一起从客户端到服务器的路线是什么原因导致你的连接下降。