【问题标题】:C++ - detecting dead socketsC++ - 检测死套接字
【发布时间】:2014-07-28 14:39:53
【问题描述】:

我有一个用 C++ 编写的服务器应用程序。当客户端连接时,它会为他创建一个新线程。在那个线程中有一个从套接字读取的阻塞。因为客户端可能会意外断开连接并留下仍然挂在读取函数上的线程,所以有一个线程通过发送“心跳消息”来检查套接字是否仍然存在。该消息由 1 个字符组成,并被客户端“忽略”(它不像其他消息那样处理)。写法是这样的:

write(fd, ";", 1);

它工作正常,但真的有必要通过套接字发送一个随机字符吗?我试图发送一条空消息(长度为 0 的“”),但没有成功。有没有更好的方法来解决这个套接字检查?

编辑:

我正在使用 BSD 套接字 (TCP)。

【问题讨论】:

  • 我认为您应该扩展您正在使用的套接字方法,因为 c++ 标准中没有套接字。
  • 这些是 TCP 套接字吗?如果是这样,请考虑使用 TCP keepalive。
  • 使用合理的读取超时时间。

标签: c++ sockets tcp


【解决方案1】:

我假设当您说“套接字,您的意思是 TCP 网络套接字”时。

如果这是真的,那么 TCP 协议会为您提供 keepalive option,您需要让操作系统使用它。

假设一个 BSDish 套接字库,我认为这个 StackOverflow answer 可以满足您的需要。

【讨论】:

  • 感谢您的回答!我刚刚尝试了您的解决方案,它在 Linux 上运行良好,但我了解到在设置 keepalive 选项(例如 TCP_KEEPINTVL,...)时存在一些可移植性问题。我还需要它在 Windows 上工作。默认时间对我的使用来说太长了。有什么建议吗?
  • 很高兴它有帮助。 Windows 有一个非常 BSDish 的套接字 API,您可以使用大多数套接字代码,但您必须根据需要对事物进行进出 #ifdef。在这里查看:msdn.microsoft.com/en-us/library/windows/desktop/… 搜索“KEEPALIVE”。祝你好运!
【解决方案2】:

根据我的经验,在 TCP 上使用心跳消息(并检查响应,例如 NOP/NOP-ACK)是在应用层获得可靠且及时的连接指示的最简单方法。网络层可以做​​一些有趣的事情,但在您的应用程序中获取通知可能会很棘手。

如果您可以切换到 UDP,您将在应用层拥有更多控制权和灵活性,并且可能会减少总体流量,因为您可以自定义通信,但您需要自己处理可靠性、数据包排序等.

【讨论】:

  • 不幸的是我不能切换到UDP,因为客户端的协议不能改变,虽然减少流量会很方便,因为连接是通过GPRS建立的。如果可移植性会成为 keepalive 的问题,我会坚持使用您的解决方案。
【解决方案3】:

您可以设置连接 KEEPALIVE。您可能对此链接感兴趣:http://tldp.org/HOWTO/TCP-Keepalive-HOWTO/overview.html

如果它只是玩具,你可以为每个新来的请求创建一个线程。在大多数情况下,我使用轮询(即非阻塞 io)来提高性能。

【讨论】:

    猜你喜欢
    • 2018-09-25
    • 2020-07-04
    • 1970-01-01
    • 2021-09-11
    • 2011-09-18
    • 1970-01-01
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多