我有一个看起来像这样的服务器程序
{
socket();
bind();
listen();
while(1)
{
accept();
recv();
send();
close();
}
close();
}
假设服务器正在运行,正在侦听指定的端口。如何通过按键盘关闭它?我的意思是一个正确的闭包,而不是Ctrl + C.
答案 0 :(得分:1)
当您close()
accept()
中阻塞的套接字时,accept()
调用将立即返回-1。
如果您的程序是单线程的,就像您显示的一样,那么您无法执行上述操作。您需要至少引入一个额外的线程来实际执行close()
。
答案 1 :(得分:0)
让程序安装一个信号处理程序(例如SIGUSR1
)什么也不做。
使用setsockopt()
为正在使用的套接字取消设置选项SA_RESTART
。
使代码发出套接字相关的系统调用知道它们可能会返回-1
并且errno
设置为EINTR
。
运行程序。
发送一个信号,程序从外面安装了一个处理程序(在1.中)(例如使用kill <pid> -USR1
命令)。
检测信号的接收(参见3.)并作出反应,例如close()
有问题的插座。