在C linux中关闭服务器套接字

时间:2013-12-02 21:39:43

标签: c linux sockets tcp

我有一个看起来像这样的服务器程序

{
    socket();
    bind();
    listen();

    while(1)
    {
        accept();
        recv();
        send();
        close();
    }

    close();
}

假设服务器正在运行,正在侦听指定的端口。如何通过按键盘关闭它?我的意思是一个正确的闭包,而不是Ctrl + C.

2 个答案:

答案 0 :(得分:1)

当您close() accept()中阻塞的套接字时,accept()调用将立即返回-1。

如果您的程序是单线程的,就像您显示的一样,那么您无法执行上述操作。您需要至少引入一个额外的线程来实际执行close()

答案 1 :(得分:0)

  1. 让程序安装一个信号处理程序(例如SIGUSR1)什么也不做。

  2. 使用setsockopt()为正在使用的套接字取消设置选项SA_RESTART

  3. 使代码发出套接字相关的系统调用知道它们可能会返回-1并且errno设置为EINTR

  4. 运行程序。

  5. 发送一个信号,程序从外面安装了一个处理程序(在1.中)(例如使用kill <pid> -USR1命令)。

  6. 检测信号的接收(参见3.)并作出反应,例如close()有问题的插座。

相关问题