![Socat未關閉tcp連接](https://rvso.com/image/1490203/Socat%E6%9C%AA%E9%97%9C%E9%96%89tcp%E9%80%A3%E6%8E%A5.png)
我socat 1.7.3.1-r0
在 Linux 伺服器上使用並執行以下命令alpine 3.3
:
socat -d -d -d PTY,link=/dev/ttyFOOBAR,echo=0,raw,unlink-close=0 TCP-LISTEN:7000,forever,reuseaddr
Socat
將偵聽客戶端並透過 TCP 將資料從虛擬序列埠傳遞/dev/ttyFOOBAR
到客戶端並再次返回來建立雙向通訊。一旦客戶端斷開連線socat
就應該退出。
建立此類連線後,socat 會記錄以下內容:
I socat by Gerhard Rieger - see www.dest-unreach.org I This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit. (http://www.openssl.org/) I This product includes software written by Tim Hudson ([email protected]) I setting option "symbolic-link" to "/dev/ttyFOOBAR" I setting option "echo" to 0 I setting option "raw" I setting option "unlink-close" to 0 I openpty({5}, {6}, {"/dev/pts/3"},,) -> 0 N PTY is /dev/pts/3 I setting option "forever" to 1 I setting option "so-reuseaddr" to 1 I socket(2, 1, 6) -> 7 I starting accept loop N listening on AF=2 0.0.0.0:7000 I accept(7, {2, AF=2 CLIENT_IP:PORT}, 16) -> 8 N accepting connection from AF=2 CLIENT_IP:PORT on AF=2 172.20.0.2:7000 I permitting connection from AF=2 CLIENT_IP:PORT I close(7) I resolved and opened all sock addresses N starting data transfer loop with FDs [5,5] and [8,8]
ss
伺服器上的命令列印:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 172.20.0.2:7000 CLIENT_IP:PORT
問題是,當我斷開客戶端連線(透過將其關閉)時,tcp 連線仍然建立,並且 socat 沒有新增任何日誌記錄。ss
仍將連接顯示為 ESTAB。有什麼想法嗎?當我再次連接客戶端時,日誌中會顯示以下內容:
W read(8, 0x7fa8f48c4020, 8192): Connection reset by peer
N socket 2 to socket 1 is in error
N socket 2 (fd 8) is at EOF
I poll timed out (no data within 0.500000 seconds)
I close(5)
I shutdown(8, 2)
I shutdown(8, 2): Socket not connected
N exiting with status 0
但為什麼會在連線而不是斷開連線時發生這種情況呢?
答案1
當您關閉客戶端時,它沒有機會告訴對方它正在消失。判斷對等方已消失的唯一方法是嘗試向其發送一些內容,然後發現它沒有回應。
如果您的應用程式要求偵測失效對等點,則必須實現失效對等點偵測。您可以透過啟用keepalive
中的選項來做到這一點socat
,但這仍然需要幾個小時才能偵測到失效的對等點。您也可以透過定期發送一些內容來做到這一點——如果對等方死亡,發送將超時,從而觸發檢測。如果對方應該向您發送數據,如果您沒有收到您期望的數據(可能帶有socat
's-T
標誌),您可以中止。