繁体   English   中英

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

[英]Closing a server socket in C linux

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

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

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

    close();
}

假设服务器正在运行,正在侦听指定端口。 如何按键盘将其关闭? 我的意思是适当的关闭,而不是按Ctrl + C。

close()一个阻塞accept() close()的套接字时, accept()调用将立即以-1返回。

如果您的程序像您显示的那样是单线程的,那么您将无法执行上述操作。 您可能需要引入至少一个其他线程才能实际执行close()

  1. 让程序安装一个不执行任何操作的信号处理程序(例如SIGUSR1 )。

  2. 使用setsockopt()可以为使用中的套接字取消设置选项SA_RESTART

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

  4. 运行程序。

  5. 从外部向其发送信号,表明该程序已安装了处理程序(在1.中)(例如,使用kill <pid> -USR1命令)。

  6. 检测信号的接收(请参阅3.)并作出反应,例如通过close()有问题的套接字来close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM