我有一個服務器正在監聽stdin(用戶)和其他客戶端。我如何優雅地關閉我的服務器?
假設服務器連接到許多客戶端(使用select
來控制所有文件描述符),並且用戶在終端中輸入EXIT。這意味着服務器應該關閉自己。
什麼是正常關閉服務器的正確方法?服務器是否應該通過所有文件描述符並且所有文件都是close(fd)
或者只需關閉listener
fd?或者,我應該不關閉任何東西,只讓服務器進程完成並退出?
我在程序中只使用了一個線程。
謝謝。
我有一個服務器正在監聽stdin(用戶)和其他客戶端。我如何優雅地關閉我的服務器?
假設服務器連接到許多客戶端(使用select
來控制所有文件描述符),並且用戶在終端中輸入EXIT。這意味着服務器應該關閉自己。
什麼是正常關閉服務器的正確方法?服務器是否應該通過所有文件描述符並且所有文件都是close(fd)
或者只需關閉listener
fd?或者,我應該不關閉任何東西,只讓服務器進程完成並退出?
我在程序中只使用了一個線程。
謝謝。
關閉收聽者fd
表示不再接受任何連接。處理這種情況的最好辦法是:
閉幕一個進程會自動關閉所有打開的文件描述符。在退出之前告訴所有人關閉只是一種方便,以免突然關閉連接。
對於「正常斷開連接」,您還應該調用shutdown(fd, SHUT_RDWR);
(shutdown()),以便您可以確保在關閉套接字之前發送和接收所有數據。
請注意,如果你在linux下工作,你可以考慮使用epoll而不是select。
一個簡單的'_exit()'將確保處理意外斷開連接的代碼得到更好的測試。 – jilles 2011-05-27 10:43:21