[英]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.