使用TCP的持久双工而没有任何KeepAlive()方法

时间:2011-05-17 14:04:49

标签: tcp wcf-binding keep-alive durable-duplex

我需要为事件通知实现持久的TCP双工连接。客户注册事件和服务器会将此事件通知所有订户。

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

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

我能够发明某种具有长接收和不活动超时的解决方案。如果服务器仍处于联机状态并使用某种KeepAlive()方法进行连接,则客户端会在短时间内“检查”服务器。

我希望在我的服务合同中没有KeepAlive()方法的解决方案。

有什么想法吗?

// Miro

1 个答案:

答案 0 :(得分: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,那么您需要定期向服务器发送实际数据,或者找出从客户端到服务器的路由导致您的连接丢失。