【问题标题】:How to terminate a socket accept blocking如何终止套接字接受阻塞
【发布时间】:2016-03-02 18:00:20
【问题描述】:

我用 C 代码开发了一个服务器。

我使用accept() 函数让我的服务器监听给定的套接字。

我的服务器在线程中启动。

现在在其他线程中,在某些情况下,我想停止 accept() 阻塞,然后关闭相关套接字。

我该怎么做? shutdown() 能做到吗?

【问题讨论】:

标签: c linux sockets networking


【解决方案1】:

[这不适用于 Windows]

  • 使用sigaction() 安装信号处理程序,假设SIGUSR1 什么都不做,但未设置SA_RESTART 选项(另请参阅“信号处理程序中断系统调用和库函数”在此man-page)。

  • 然后向阻塞进程发送SIGUSR1 信号。

accept() 然后将返回-1 并将errno 设置为EINTR

【讨论】:

    【解决方案2】:

    通常,从另一个线程关闭套接字会导致 accept() 调用返回错误。有人告诉我,这在某些 Linux 版本上不起作用,但我自己没有看到任何证据 - 每次在 Windows/Linux 上,accept() 都会返回错误/异常。

    另一个常见的解决方案是在每次 accept() 返回后检查一些“关闭”原子布尔值。当你想停止它时,设置布尔值并在 localhost 堆栈上执行 connect(),从而使 accept() 以“正常”方式返回。

    【讨论】:

    • 应该稍微更正:代替 close() 做 shutdown() 便携式解决方案。更多细节在这里stackoverflow.com/a/62356967/70405。不要介意提升参与,解决方案是在套接字 API 级别。
    【解决方案3】:

    在我只在 Linux Mint 18.3 下的套接字上调用 close 之后,我遇到了 accept 没有终止的问题。我通过在close 之前调用shutdown(socket_fd, SHUT_RD); 解决了这个问题

    mah 已经提到过,但我想强调一下,因为这是谷歌搜索“socket stop accept”的第一个 SO 结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-10-31
      • 2013-10-15
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 2017-01-11
      • 1970-01-01
      相关资源
      最近更新 更多