我使用Ctrl-C來終止服務器,我認爲它會立即關閉套接字。但事實證明,如果我綁定相同的端口,它會說綁定失敗。我使用Mac OS X.有什麼想法?我甚至實現了ctrl C關閉它的信號處理程序,但仍然有同樣的問題。linux套接字:在C中關閉套接字
回答
你可以用這個擺脫錯誤的,你之前將其綁定(至少在Linux上,我不知道OSX)
int on = 1;
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, on.sizeof); // or sizeof(on) in C
當套接字關閉時,內核周圍保持一個手柄如果網絡上還有一些懸而未決的數據到達無序或遲到或某事物,那麼它可以在到達時正確處理它,通過告訴另一方它現在被關閉,而不是將這些隨機塊傳送到下一個應用程序。如果你想了解更多信息,這就是所謂的「time_wait」狀態。在釋放所有內容之前需要幾分鐘,以確保清楚。
這個重用addr選項告訴它不用擔心這一點,只需重新綁定即可,無需等待。
+1解釋爲什麼發生這種情況。 – Xaqq
創建套接字時,您可以使用SO_REUSEADDR
標誌。從手冊頁:
指示在bind(2)調用中提供的用於驗證地址 的規則應允許重用本地地址。對於 AF_INET套接字,這意味着一個套接字可以綁定,除非當有一個活動的監聽套接字綁定到該地址時 。 當偵聽套接字綁定到INADDR_ANY與 特定端口時,則不可能將任何本地地址綁定到此端口的 。參數是一個整數布爾標誌。
這樣,只要重新啓動程序並且沒有活動的套接字綁定,就可以重新綁定。
您還可以在套接字創建後(但在執行bind
之前)使用setsockopt
來設置此標誌。請參閱Adam's answer。
你可能想提到'setsockopt'。 – Duck
- 1. Linux套接字未關閉
- 2. 在C中的Linux套接字編程,服務器套接字不能關閉
- 3. java套接字SocketException套接字關閉
- 4. 關閉套接字
- 5. 關閉套接字?
- 6. 關閉套接字連接
- 7. C套接字:當套接字關閉時避免垃圾
- 8. 閉合的套接字,java.net.SocketException:套接字關閉
- 9. Apache套接字不關閉?
- 10. Codenameone關閉套接字
- 11. java.net.SocketException套接字已關閉
- 12. 套接字關閉異常
- 13. 套接字關閉時間
- 14. JMeter java.net.SocketException:套接字關閉
- 15. android SocketException:套接字關閉
- 16. 關閉HTML5 Web套接字
- 17. 套接字關閉問題
- 18. 安卓:關閉套接字
- 19. 關閉線程套接字
- 20. Java - 關閉UDP套接字
- 21. 套接字不斷關閉
- 22. 如何關閉套接字
- 23. perl的關閉套接字
- 24. 關閉套接字和Windows
- 25. 套接字意外關閉
- 26. 如何在Linux上關閉'關閉'套接字使用命令?
- 27. Chrome - 禁用Web套接字或關閉Web套接字連接?
- 28. 關閉套接字後,套接字連接保持ESTABLISHED
- 29. C++ Linux TCP套接字fd
- 30. C(Linux)檢查套接字
linux!= osx。他們是兩個完全獨立的操作系統...你是什麼意思「Linux套接字」? –