3
無利害關係的好奇心......當積壓已滿時,爲什麼ServerSocket連接不被拒絕?
在Java中我聽一個插座上,以1積壓:
ServerSocket ss = new ServerSocket(4000, 1);
在彈我跑
netcat localhost 4000
很多次 - 5爲止。
連接永遠不會被拒絕。 netcat
的每個實例都會等待,直到我的ServerSocket被銷燬。
Backlog長度爲1 - 這意味着它應該只允許一個傳入連接排隊,然後拒絕,不是嗎? ((我不知道隊列中是否包含第一個 - 現在不重要))
我知道我可以通過關閉ServerSocket(然後在準備好時打開另一個)來完成這項工作,但...不應該它工作嗎?
我誤解了嗎?
http://stackoverflow.com/a/20353156/3166303 – leeor
此行爲是依賴於平臺的。當積壓填滿時,Windows會發出RST,導致「連接被拒絕」。 Unix,Linux只丟棄SYN數據包。 – leeor
如果您正在linux上運行,請閱讀http://veithen.github.io/2014/01/01/how-tcp-backlog-works-in-linux.html。如果你發送了一些東西,netcat可能在幾分鐘後超時,否則它會認爲連接已經建立。 (或者試試'echo 1>/proc/sys/net/ipv4/tcp_abort_on_overflow') – nos