簡體   English   中英

一種檢測套接字對等方觸發斷開連接的方法

[英]A way to detect which side of the socket peers triggered the disconnection

進程是否有辦法檢測TCP連接的哪一側觸發了第一個FIN? 與流程進行通信的我的流程或網絡實體。

假設我在Linux上有一個多線程進程,該進程的一個套接字處理與其他網絡實體建立的TCP套接字。

從理論上講,我進程中的一個線程可以關閉由第二個線程處理(選擇/讀取/發送)的套接字。

有沒有辦法檢測首先觸發連接斷開的那一側?

只需將某種應用程序級結構與套接字關聯即可。 有一個規則,如果線程希望關閉或終止連接,則必須在應用程序級結構中指出。

進程中的所有線程都應該協同工作。 您不需要“進入”線程來找出它做了什么或使它做正確的事情。 應該對它進行編碼,以告知其他線程他們需要知道的內容。

進程是否有辦法檢測TCP連接的哪一側觸發了第一個FIN?

tcpdump可以向您顯示。 這是一個例子。 服務器應用程序偵聽7752端口。 客戶端首先建立連接,然后客戶端關閉連接。 所以這是輸出:

# tcpdump -i lo 'tcp[13] & 1 != 0'
11:12:28.613424 IP localhost.50631 > localhost.7752: Flags [F.], seq 12878459, ack 4245407789, win 276, options [nop,nop,TS val 3690514841 ecr 3690513840], length 0
11:12:28.613720 IP localhost.7752 > localhost.50631: Flags [F.], seq 1, ack 1, win 256, options [nop,nop,TS val 3690514841 ecr 3690514841], length 0

如果您正在使用select()或類似的東西( poll()epoll()kqueue()等),則應始終監視套接字的就緒狀態。 當套接字上的recv() (或read() )返回0 ,表示另一端已在套接字上發出關閉命令(通過調用shutdown()close() )。

如果您希望API檢測到您是否已經使用shutdown()發出了一半關閉通知,則套接字上的send() (或write() )將觸發SIGPIPE 如果忽略SIGPIPE ,或者如果傳遞了send()則傳遞MSG_NOSIGNAL標志,則將產生EPIPE錯誤。

如果線程已經在套接字上調用close() ,則該線程嘗試在套接字上進行任何I / O操作都是錯誤的。 結果可能是不確定的,因為套接字文件描述符可能會被進程重用於其他目的。 這種錯誤類似於使舊的指針指向已由其他線程分配的已釋放內存。

暫無
暫無

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

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