1

我需要为事件通知实现一个持久的 TCP 双工连接。客户端注册事件,服务器将此事件通知所有订阅者。

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

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

我能够发明某种具有长接收和不活动超时的解决方案。如果服务器仍然在线并使用某种 KeepAlive() 方法连接,客户端会在短时间内“脉冲检查”服务器。

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

有任何想法吗?

//米罗

4

1 回答 1

2

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 的 keep-alive,那么您需要定期向服务器发送真实数据,或者找出从客户端到服务器的路径中导致连接断开的原因。

于 2011-05-31T07:21:27.470 回答