[英]Detecting a TCP reset with Linux sockets
當TCP鏈路的一端斷開連接時,它會向另一端發送重置(RST)消息。 我希望能夠在應用程序層中收到此信息。
在我的代碼中,我使用select()
調用來接收來自潛在多個源的輸入,包括TCP連接。 我已經看到,當select()
顯示有數據准備好在連接上讀取,然后read()
調用返回0字節讀取,這發生在通過TCP發送RST之后。 (我理解recv()
與read()
工作方式類似。)
僅當連接被重置時, read()
是否在TCP連接上返回0字節(在select()
)? 在任何其他情況下它是否會返回0字節?
我記得前一段時間在連接的另一端使用了一個特定的以太網設備,而這個Linux端在select()
之后接收了0個字節,但不是用於連接重置,而是在某些數據流中途。 我在Wireshark中確認收到的數據包有0個數據字節。 這是一個錯誤,或者像上面的問題一樣,這種行為是否有效? 我不記得它是哪個設備,因為它是幾年前,但它使用的是Windows驅動程序。
當TCP鏈路的一端斷開連接時,它會向另一端發送重置(RST)消息。
不正常。
我希望能夠在應用程序層中收到此信息。
你會。
我已經看到,當select()顯示有數據准備好在連接上讀取,然后read()調用返回0字節讀取,這發生在通過TCP發送RST之后。
沒有。
僅當連接被重置時,read()是否在TCP連接上返回0字節(在select()之后)?
從不重置連接。 在這種情況下,它返回-1,並且errno == ECONNRESET
。
在任何其他情況下它是否會返回0字節?
當且僅當收到FIN時,它返回零,即對等體關閉連接,或關閉其套接字輸出。
如果您嘗試連接到沒有偵聽器的服務器上的端口,也會獲得RST。
假設您已連接到服務器並定期向其發送數據,但隨后服務器重新啟動,您的套接字對當然不再存在,然后您也會獲得RST。
通過使用我認為的套接字選項,服務器可以發送RST,但這不是一個好主意,服務器/客戶端應該在正常情況下使用套接字正常關閉,以便關閉通信,並讓TCP的4路握手可以做到這一點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.