c++ - 如何检查连接是否丢失

标签 c++ sockets winapi tcp winsock2

如何检查我与服务器的连接是否丢失? (无论是客户端还是服务器端) 我正在使用 TCP 连接,并且服务器 recv unlimit 客户端。服务器为每个客户端创建线程。这样我就可以为每个客户接收/发送。

最佳答案

您可以考虑使用 TCP-keepalive option在套接字上作为一种选择。

但是如果在一定时间内没有观察到任何事件,许多 NAT 和有状态防火墙实际上会丢弃 TCP 连接。并且这种事件超时可能比 TCP 支持的周期性保持事件消息更快。出于这个原因,每 30-60 秒向您的服务器发送一条协议(protocol)消息通常足以保持与 NAT 相关的连接“有效”。

我个人的看法是这样的。如果连接需要长时间运行,客户端有责任通知服务器“我还在这里”。服务器应定期唤醒并关闭在过去 N 秒内没有任何流量的任何 TCP 连接。 (其中 N 是您应用的合理值)。在您的情况下,“每个客户端线程”方法意味着每个线程只需要决定远程客户端何时变得无响应。

在该协议(protocol)内,客户端可以每 30-60 秒向服务器发送一次它自己的自定义“ping”消息。服务器始终会返回此消息并记录客户端仍在附近。

我正在讨论的很多内容实际上取决于您的协议(protocol)、您的服务做什么以及连接预计持续多长时间。

关于c++ - 如何检查连接是否丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15272491/

相关文章:

c++ - 一个应用程序可以运行另一个应用程序的代码吗?

android - 与其他字符相比,c++/Arduino 是否以不同方式处理 '?'

c++ - echo 服务器多次返回相同的输入

c++ - 在结构中自动索引枚举 ID

c++ - boost asio SSL 服务器错误 : called a function you should not call

node.js - 如何通过 Nodejs WebSocket 连接到 RouterOS?

c++ - 查找启动进程的命令行选项

c++ - 如何将 HTML 字符串加载到嵌入式 WebBrowser 控件?

c++ - 将Gtk::ListStore添加到Gtk::TreeView并将行添加到ListStore(gtkmm)

c++ - 打印出一个 std::vector<std::wstring>