我用C代码开发了一个服务器。
我使用accept()
函数让我的服务器监听给定套接字。
我的服务器是在一个帖子中启动的。
现在在其他线程中,对于某些情况,我想停止accept()
阻止,然后关闭相关套接字。
我怎么能这样做? shutdown()
能做到吗?
答案 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结果。