tcp - 无需任何 KeepAlive() 方法的 TCP 持久双工

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

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

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

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

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

我希望在我的服务契约(Contract)中没有 KeepAlive() 方法的情况下获得解决方案。

有什么想法吗?

//米罗

最佳答案

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

关于tcp - 无需任何 KeepAlive() 方法的 TCP 持久双工,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6031995/

相关文章:

wcf - WCF 4 Web 服务中的 UsernameToken 和 SSL - 但使用 basicHttpBinding

c# - 客户端在 Windows 服务中找不到 WCF 的端点元素

Android 和 SO_KEEPALIVE - sleep 设备是否仍会发送 keepalive 段?

c - 通过互联网连接时出现奇怪的数据损坏

java - 无法使私有(private)广播方法起作用

c++ - 未调用 Qt incomingConnections

Android:HttpURLConnection 不会断开连接

java - 适用于套接字流的C++/Java序列化库?

WCF 客户端与 Java WS 通信,异常 : The content type application/xop+xml; type ="application/soap+xml" of the response message

c# - 如何禁用 ASP.NET Web 服务客户端请求的保持事件状态?