Cygwin

Socat在多個程序之間共享串列連結

  • November 28, 2012

我有一個場景,同一個盒子上的多個程序想要與串列設備通信。程序A需要與串口進行雙向通信,程序B只需要能夠寫入串口即可。串列設備不斷噴出數據,而兩個程序定期寫入埠。環境是 Windows 上的 Cygwin(程序是 Windows 程序),但如果有人有僅 Linux 的解決方案,則可以將串列埠移動到 *nix 虛擬機。

我的“網路圖”如下:

                                        /--<->--[Process A]
[serial device]-ttyS0--<->--[socat]-udp-<
                                        \--<<<--[Process B]

我的第一次嘗試是使用 udp-recvfrom 和 fork 選項設置一個 socat 實例。這適用於第一個數據包 - 一個程序從 socat 分叉,將數據發送到串列設備,然後開始從串列設備讀回數據。但是,這個分叉的程序現在打開了串口進行讀寫,所以沒有更多的分叉成功啟動。

任何人都可以想出任何方法來讓它工作嗎?我可以想到以下途徑,但我還沒有找到使它們中的任何一個起作用的設置:

  • 使用 socat 的 udp-recv 選項接收來自任何人的資訊,但要找到一種方法讓它向特定地址發送回复。
  • 使用兩個單向 socat,一個用於寫入埠,一個用於從埠讀取。然後我需要一種方法將這兩個單向流組合成一個雙向流,但我不知道如何。

我找到了解決方案。它涉及到 4 個 socat 實例,排列在下面的網路圖中:

                              /-<-[A - udp receiver] <=udp= [D - udp sender]-<-\
ttyS0 <--> [B - serial adapter]                                                  [C - tcp adapter] <=tcp=> Process A
                              \->-------------------------------------------->-/
  • Socat “B” 與串列埠通信,在標準輸入上輸入並輸出到標準輸出。
  • Socat “A” 監聽來自任何地方的 UDP 數據包,並通過標準輸出將它們輸出,然後通過管道將它們傳送到 socat “B”。
  • Socat“C”監聽來自程序A的TCP連接。來自socat“A”的數據進入stdin並被路由到程序A。來自程序A的數據被發送到stdout到socat“D”。
  • Socat “D” 從標準輸入獲取數據並通過 UDP 將其發送到 socat “A”。

程序 B 在要注入流量時向 socat “B” 發送 UDP 數據包。

創建這個怪物的 bash 命令如下:

socat -d -d -d -lpA_udp_rxr -u -T5 udp-recv:1111 - 2>>log.txt |
socat -d -d -d -lpB_serial_adapter -t5 - /dev/ttyS0,raw 2>>log.txt |
socat -d -d -d -lpC_tcp_adapter -T5 - tcp4-listen:3333 2>>log.txt |
socat -d -d -d -lpD_udp_sender -u -T5 - udp:localhost:1111,sourceport=2222 2>>log.txt 

這也將超時設置為 5 秒,並將大量詳細資訊記錄到“log.txt”中。為安全起見更換了埠號。

引用自:https://serverfault.com/questions/453032