如何优雅地关闭我的服务器?

时间:2011-05-27 08:47:48

标签: c sockets

我有一个正在侦听stdin(用户)和其他客户端的服务器。

假设服务器连接到许多客户端(使用select来控制所有文件描述符),用户在终端中输入EXIT。这意味着服务器应该自行关闭。

正常关闭服务器的正确方法是什么?服务器应该通过所有文件描述符和所有文件描述符close(fd)还是只关闭listener fd?或者,我不应该关闭任何东西,让服务器进程完成并退出吗?

我在程序中只使用了一个线程。

谢谢。

2 个答案:

答案 0 :(得分:4)

关闭监听器fd意味着不再接受任何连接。处理这个的最好方法是:

  • 停止接受连接
  • 告诉大家关闭(通过您的协议)
  • 等待一段时间,然后关闭服务器

关闭进程会自动关闭其所有打开的文件描述符。在退出之前告诉所有人关闭只是为了方便,以免突然关闭连接。

答案 1 :(得分:2)

对于“正常断开连接”,您还应该调用shutdown(fd, SHUT_RDWR);shutdown()),以便在关闭()套接字之前确保发送和接收所有数据。

另外,如果您在Linux下工作,可以考虑使用epoll而不是选择。