簡體   English   中英

套接字的連接超時和讀取超時有什么區別?

[英]What is the difference between connection and read timeout for sockets?

3個問題:

  1. 套接字的連接超時和讀取超時有什么區別?

  2. 連接超時設置為“無窮大”是什么意思? 在什么情況下它可以保持在不定式循環中? 什么可以觸發無限循環死亡?

  3. 讀取超時設置為“無窮大”是什么意思? 在什么情況下它可以保持在不定式循環中? 什么可以觸發無限循環死亡?

  1. 套接字的連接超時和讀取超時有什么區別?

連接超時是建立初始連接的超時時間; 即完成 TCP 連接握手。 讀取超時是等待讀取數據的超時時間1 如果在客戶端發出套接字read調用后服務器(或網絡)未能傳送任何數據 <timeout> 秒,則會引發讀取超時錯誤。

  1. 連接超時設置為“無窮大”是什么意思? 在什么情況下它可以保持在不定式循環中? 什么可以觸發無限循環死亡?

這意味着連接嘗試可能會永遠阻塞。 沒有無限循環,但是連接的嘗試可以被關閉套接字的另一個線程解除阻塞。 (一個Thread.interrupt()調用也可以做到這一點......不確定。)

  1. 讀取超時設置為“無窮大”是什么意思? 什么情況下可以無限循環? 什么可以觸發無限循環結束?

這意味着對套接字流的read調用可能會永遠阻塞。 再次沒有無限循環,但可以通過Thread.interrupt()調用解除read阻塞,關閉套接字,以及(當然)另一端發送數據或關閉連接。


1 - 它不是......正如一位評論者所想的......套接字可以打開或空閑多長時間的超時。

這些是 JVM 為建立 TCP 連接和等待從套接字讀取數據而強制執行的超時值。

如果該值設置為無窮大,您將不會永遠等待。 這只是意味着 JVM 沒有超時,操作系統將負責所有超時。 但是,操作系統上的超時可能真的很長。 在某些慢速網絡上,我見過長達 6 分鍾的超時。

即使您為套接字設置了超時值,如果超時發生在本機代碼中,它也可能不起作用。 我們可以通過連接到被防火牆阻止的主機或拔掉交換機上的電纜來在 Linux 上重現該問題。

處理 TCP 超時的唯一安全方法是在不同的線程中運行連接代碼,並在時間過長時中斷該線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM