非阻塞socket通訊一定要心跳包嗎?

時間 2021-06-01 02:34:55

1樓:魯哈花

在實際應用中,網路連線可能因以下原因斷開(以windows為例):

對方應用程式關閉套接字(型別A)

對方應用程式崩潰(型別A)

對方應用程式被無限期掛起(型別B)

對方機器關機(型別A)

對方機器藍屏宕機(型別B)

對方機器斷電關機(型別B)

網路物理層斷開(拔網線)(型別B)

其中標註了型別A的幾種情況,對方會主動關閉TCP連線,傳送FIN或RST訊號,我方的recv呼叫將立即返回。

而對於標註了型別B的幾種情況,我方不會收到任何訊號,可能導致阻塞的recv永遠不會返回,非同步的recv也永遠不會有完成的通知。

為此,tcp協議中引入了心跳(保活)機制。當心跳包連續多次沒有被確認的時候,認定tcp連線已斷開,這樣,所有的型別B情形都能夠最終被確定為連線斷開。

還有一種心跳包是使用者態的心跳包,即自己封裝一種型別的資料作為心跳,定時傳送。容易想到,這樣一種在tcp協議外解決問題的辦法,還是需要依賴超時機制來確定是否真的斷開了。對於純阻塞的recv來說,收取心跳包這個動作本身依然無法處理型別B的情況。

除非:設定recv的最長阻塞時間

在另乙個執行緒中強行終止阻塞的recv

使用非阻塞的recv,在一定時間後判斷有否讀到資料

回到題主的問題,非阻塞socket通訊一定要心跳包嗎?

答案是非阻塞socket通訊還可以通過超時判斷來替代心跳包

2樓:郭寬

1. 非阻塞和心跳,沒有任何關係,不管介面層如何呼叫,如果想保持長連線,就需要定期傳送心跳包

2. 傳送的原因是地位更高的一端(通常是伺服器端),不知道另一端是不是太挫了忘了關連線,佔著茅坑不拉屎

3樓:莊嚴

1. A和Z通訊。實際路線可能是: A->b->c->d->...->Z。

2. 後來,c和d有彆扭,於是: A->b->c 「斷X了」 d->->Z。

3. 除非有超時機機制,否則recv函式不會知道c和d的分手的事。

人為什麼一定要有上進心?

又想白嫖 人如果沒有上進心就沒有今天的這個社會,古代的政治制度不斷改善和改進,之前的舊思想就會被慢慢的淘汰,人也是一樣,沒有上進心就會被淘汰! 小王子 為什麼大家都會認為沒有上進心,就是沒有錢呢?人真的可以沒有上進心,就可以多注重個人感受,不追求位高權重享受被追捧的感覺,不追求博學多聞,但是會在日常...

為什麼人一定要有上進心?

要上進的觀念很多都是社會強行灌輸給你的。問題是現在衣食住行等基本需求都越來越貴了,不上進也得上進,當然家裡能安排房子的除外。並不是一定要有上進心,但沒有上進心就是在過失殺人,你殺掉的是自己的人生。沒有上進心不是過錯,只會錯過而已。你犯了錯有些可以悔改,但有些是不可逆的,錯過了就真的錯過了。我們如此上...

修行一定要開啟心輪麼?望修行人解答 ?

海東超 開啟新人的感覺是很痛的。可能一顆心需要在冰與火之間不斷的蹂躪,不斷的拉扯。你從小到大,盛是生生世世所積累的很多的東西處理的好了它就是養分,作為你開啟心靈的有乙個智齒,如果處理不好卻封鎖你的心。解鈴人需繫鈴人。是什麼把你的心繫上了,你就仍然。要再去面對,可把它化解。這需要莫大的勇氣智慧型以及人...