2016-03-02 125 views
0

我公司开发与C语言代码如何终止插座接受阻塞

的服务器我用accept()功能,以保持我的服务器listenng赐插座上。

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

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

我该怎么做? shutdown()可以做到吗?

+0

我并不积极,但我怀疑你可以简单地关闭accept()所在的套接字。也许'关机()'这样做。当你尝试时发生了什么? – mah

回答

2

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

另一个常见的解决方案是在每个accept()返回后检查一些'shutdown'原子布尔值。当你想停止它时,设置布尔值并在本地主机堆栈上执行connect(),因此导致accept()以“正常”方式返回。

1

这不适用于Windows。

  • 使用sigaction()安装的信号处理程序,比方说SIGUSR1无所作为,而是具有SA_RESTART选项取消设置(也称“通过信号处理系统调用和库函数的中断”这一man-page见)。

  • 然后发送阻止过程a信号。然后

accept将返回-1并设置errnoEINTR