2011-05-27 121 views
3

我有一個服務器正在監聽stdin(用戶)和其他客戶端。我如何優雅地關閉我的服務器?

假設服務器連接到許多客戶端(使用select來控制所有文件描述符),並且用戶在終端中輸入EXIT。這意味着服務器應該關閉自己。

什麼是正常關閉服務器的正確方法?服務器是否應該通過所有文件描述符並且所有文件都是close(fd)或者只需關閉listener fd?或者,我應該不關閉任何東西,只讓服務器進程完成並退出?

我在程序中只使用了一個線程。

謝謝。

+0

一個簡單的'_exit()'將確保處理意外斷開連接的代碼得到更好的測試。 – jilles 2011-05-27 10:43:21

回答

4

關閉收聽者fd表示不再接受任何連接。處理這種情況的最好辦法是:

  • 停止接受連接
  • 告訴大家關閉(通過你的協議)
  • 等待一段時間,然後關閉服務器

閉幕一個進程會自動關閉所有打開的文件描述符。在退出之前告訴所有人關閉只是一種方便,以免突然關閉連接。

2

對於「正常斷開連接」,您還應該調用shutdown(fd, SHUT_RDWR);shutdown()),以便您可以確保在關閉套接字之前發送和接收所有數據。

請注意,如果你在linux下工作,你可以考慮使用epoll而不是select。