
我正在嘗試使用 TCP 設定一個簡單的 socat 檔案伺服器來傳送小檔案(~100KB)。
以下是一個文件的單行伺服器和客戶端:
伺服器:socat -u -d -d OPEN:file.dat TCP-LISTEN:<port>,reuseaddr,fork
客戶:socat -u -d -d TCP:<server>:<port> OPEN:file.dat,creat
第一個資料傳輸總是有效,但接下來的資料傳輸並不總是有效。以下大多數傳輸都會在客戶端建立一個空文件。多個客戶端傳輸一次後問題仍然存在,我確信發生錯誤時資料沒有傳輸,但日誌和返回值沒有顯示任何錯誤,只是資料循環較短。
我幾乎嘗試了這裡提到的每個選項:http://www.dest-unreach.org/socat/doc/socat.html
我發現讓它連續多次工作的唯一方法是從伺服器偵聽器中刪除 fork 選項並將整個命令列包裝在 bash 循環中,但當然它對於多個客戶端來說會失敗。
我嘗試過 Ubuntu、Fedora、Redhat 和 FreeBSD。
我錯過了什麼還是這是一個錯誤?
答案1
我遇到了同樣的問題,我花了幾個小時才弄清楚我做錯了什麼。我仍然不知道,但我至少知道如何讓它發揮作用。我正在使用:
socat -u FILE:/tmp/test.txt TCP-LISTEN:5778,reuseaddr,fork
當我切換到以下內容時,它按預期工作:
socat TCP-LISTEN:5778,reuseaddr,fork FILE:/tmp/test.txt
我不確定實際發生了什麼變化,但刪除標誌-u
並交換地址順序將為多個客戶端呼叫開啟套接字。我在嘗試複製時偶然發現了它一個已知的伺服器工作範例。
我的客戶也很簡單socat -u TCP:localhost:5778 STDOUT
。沒有它-u
也可以工作。
答案2
男人男人
$ man socat | grep -m1 '\-u' -A3
-u Uses unidirectional mode. The first address is only used for
reading, and the second address is only used for writing (exam-
ple).
甚至只是幫忙
$ socat -h | grep -m1 '\-u '
…
答案3
這是因為伺服器上有一個檔案來源和多個檔案接收器(TCP 連接,分叉)。第一個客戶端消耗所有文件,將文件位置保留在 EOF(文件末尾)。任何後續 TCP 用戶端都會發現自己沒有任何內容可讀取,因為它們都使用相同的文件來源。
這更多的是 socat 的設計方面而不是錯誤。我不知道新連接有什麼方法可以重置來源文件上的查找位置。