Linux下客戶端主動Close,服務端阻塞的read函數不會馬上返回

今天在做一個socket通信的時侯,發現close後,阻塞的read函數並沒有馬上返回,導致後面的時序出現問題,具體情況如下:
服務端與客戶端正常建立通信,都採用阻塞模式。當客戶端close後,服務端阻塞的read函數並沒有馬上返回,並且此時在服務端還可以向此連接寫入數據,併成功,然後客戶端又成功讀到數據,接着服務端阻塞的read函數返回<0,表示斷開連接。
以上客戶端主動Close,服務端阻塞的read函數沒有馬上返回的現象與理想不符。後查閱,發現windows與linux在這點上不一樣,在window是上,closeSocket,阻塞的recv函數會馬上返回,但是linux上並不是這樣。

爲解決這個問題,嘗試瞭如下方法:
1. int shutdown(int sockfd,int how); 此函數可禁止在一個套接口上進行數據的接收與發送。其他博客有說明,在close前調用此函數可以使阻塞的read函數立即返回,但是我每調用此函數機器會重啓,這裏並不知道具體原因,所以放棄了這個方法。
2. 設置LINGER參數,setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger); 將延時參數設置爲0,強制關閉套接口;但是結果並不理想,也放棄;
3. 在客戶端欲關閉連接之前,先發送一個自定義消息,客戶端再close,服務端收到該標誌消息後也close,於是正常斷開連接;個人覺得,此方法雖然能夠解決問題,但總是覺得很牽強。但是最鍾還是採用了這種方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章