2014-03-03 52 views
1

我使用Ctrl-C來終止服務器,我認爲它會立即關閉套接字。但事實證明,如果我綁定相同的端口,它會說綁定失敗。我使用Mac OS X.有什麼想法?我甚至實現了ctrl C關閉它的信號處理程序,但仍然有同樣的問題。linux套接字:在C中關閉套接字

+0

linux!= osx。他們是兩個完全獨立的操作系統...你是什麼意思「Linux套接字」? –

回答

6

你可以用這個擺脫錯誤的,你之前將其綁定(至少在Linux上,我不知道OSX)

int on = 1; 
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, on.sizeof); // or sizeof(on) in C 

當套接字關閉時,內核周圍保持一個手柄如果網絡上還有一些懸而未決的數據到達無序或遲到或某事物,那麼它可以在到達時正確處理它,通過告訴另一方它現在被關閉,而不是將這些隨機塊傳送到下一個應用程序。如果你想了解更多信息,這就是所謂的「time_wait」狀態。在釋放所有內容之前需要幾分鐘,以確保清楚。

這個重用addr選項告訴它不用擔心這一點,只需重新綁定即可,無需等待。

+0

+1解釋爲什麼發生這種情況。 – Xaqq

3

創建套接字時,您可以使用SO_REUSEADDR標誌。從手冊頁:

指示在bind(2)調用中提供的用於驗證地址 的規則應允許重用本地地址。對於 AF_INET套接字,這意味着一個套接字可以綁定,除非當有一個活動的監聽套接字綁定到該地址時 。 當偵聽套接字綁定到INADDR_ANY與 特定端口時,則不可能將任何本地地址綁定到此端口的 。參數是一個整數布爾標誌。

這樣,只要重新啓動程序並且沒有活動的套接字綁定,就可以重新綁定。

您還可以在套接字創建後(但在執行bind之前)使用setsockopt來設置此標誌。請參閱Adam's answer

+1

你可能想提到'setsockopt'。 – Duck