socat TCP 檔案伺服器

socat TCP 檔案伺服器

我正在嘗試使用 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 的設計方面而不是錯誤。我不知道新連接有什麼方法可以重置來源文件上的查找位置。

相關內容