代码之家  ›  专栏  ›  技术社区  ›  Jay

在阻塞recv调用的情况下,如果对等端系统重新启动,则调用不会从recv中发出。为什么?

  •  2
  • Jay  · 技术社区  · 14 年前

    当我的代码在一个阻塞的recv调用中时,如果另一方重新启动,那么这一方recv调用就不会知道它,而是进入挂起状态。

    如何避免这种情况?

    1 回复  |  直到 14 年前
        1
  •  8
  •   caf    14 年前

    默认情况下,如果连接的另一端不正确地终止连接而消失,那么您端的操作系统就无法知道将不会有更多的数据出现。这就是为什么 recv() 在这种情况下会永远阻塞。

    如果您想要超时,那么将套接字设置为非阻塞并使用 select() 等待它变得可读。 选择() 允许您指定超时。

    或者,您可以设置 SO_KEEPALIVE 插座选项 setsockopt() . 这将启用TCP“keepalives”的发送,这将允许您的一方检测到过时的连接。(请注意,使用默认设置时,可能需要 长的 检测连接已断开的时间)。