如何终止套接字接受阻塞

时间:2016-03-02 18:00:20

标签: c linux sockets networking

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

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

我的服务器是在一个帖子中启动的。

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

我怎么能这样做? shutdown()能做到吗?

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这不适用于Windows。

  • 使用sigaction()安装一个信号处理程序让我们说SIGUSR1什么也不做,但是SA_RESTART选项未设置(另请参阅“系统调用中断部分和信号处理程序的库函数“在这个man-page上。”

  • 然后向阻止流程发送SIGUSR1信号。

然后

accept将返回-1并将errno设置为EINTR

答案 2 :(得分:0)

在Linux Mint 18.3下仅在套接字上调用accept后,close没有终止遇到麻烦。我还通过在shutdown(socket_fd, SHUT_RD);

之前调用close解决了这一问题

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