我公司开发与C语言代码如何终止插座接受阻塞
的服务器我用accept()
功能,以保持我的服务器listenng赐插座上。
我的服务器是在一个线程中启动的。
现在在其他线程和某些情况下,我想停止accept()
阻塞,然后关闭相关的套接字。
我该怎么做? shutdown()
可以做到吗?
我公司开发与C语言代码如何终止插座接受阻塞
的服务器我用accept()
功能,以保持我的服务器listenng赐插座上。
我的服务器是在一个线程中启动的。
现在在其他线程和某些情况下,我想停止accept()
阻塞,然后关闭相关的套接字。
我该怎么做? shutdown()
可以做到吗?
传统上,从另一个线程关闭套接字会导致accept()调用返回错误。我被告知,这在某些版本的Linux上不起作用,但是我自己没有看到任何证据 - 每次在Windows/Linux上,accept()都返回一个错误/异常。
另一个常见的解决方案是在每个accept()返回后检查一些'shutdown'原子布尔值。当你想停止它时,设置布尔值并在本地主机堆栈上执行connect(),因此导致accept()以“正常”方式返回。
这不适用于Windows。
使用sigaction()
安装的信号处理程序,比方说SIGUSR1
无所作为,而是具有SA_RESTART
选项取消设置(也称“通过信号处理系统调用和库函数的中断”这一man-page见)。
然后发送阻止过程a信号。然后
accept
将返回-1
并设置errno
到EINTR
。
我并不积极,但我怀疑你可以简单地关闭accept()所在的套接字。也许'关机()'这样做。当你尝试时发生了什么? – mah