我有一个通过 UDP 连接传输数据的软件。然而,在我们的系统中,我们只能通过串行端口传输数据。我正在考虑使用 UDP 和串行之间建立一座桥梁socat
。不过我对它不是很熟悉。尝试过一些教程,但它们没有帮助。也尝试阅读手册,但也没有帮助。
我找到了一个例子在这里,并根据我的需要进行了调整。这是我的嵌入式系统上的内容(它有一个静态IP)
$ socat -v udp4-datagram:172.24.176.207:54321 \
open:/dev/ttyS0,raw,nonblock,waitlock=/tmp/s0.locak,echo=0,b115200,crnl
这是我的主机上的内容(也有静态 IP)
$ socat -v udp4-datagram:172.24.176.116:54321 \
open:/dev/ttyUSB0,raw,nonblock,waitlock=/tmp/s0.locak,echo=0,b115200,crnl
你得原谅我,但我总体上是socat
文盲networking
。
一些评论和问题。
- 这是什么
open:/dev/ttyUSB0,raw,nonblock,waitlock=/tmp/s0.locak,echo=0,b115200,crnl
意思?我在哪里可以找到它的描述?我明白了/dev/ttyUSB0
和b115200
,但是剩下的是什么? 在嵌入式系统(172.24.176.207)上我运行了一个
netcat
服务器:$ nc -ul 172.24.176.207 54321
在主机上我发送了一个 UDP 数据包:
$ echo -n "hello" | nc -4u -w1 172.24.176.207 54321
但什么也没发生。我缺少什么?
答案1
回显服务器设置
我曾经socat
像这样设置 UDP 回显服务器:
$ socat UDP4-LISTEN:54321,fork EXEC:cat
回显客户端
$ echo -n "hello" | nc -4u -w1 192.168.56.101 54321
hello
TCP转储提示
调试此程序时,我喜欢监视网络,因此将运行此程序来监视“回显服务器”
$ tcpdump -i any -vnn port 54321
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
22:33:21.280053 IP (tos 0x0, ttl 64, id 8684, offset 0, flags [none], proto UDP (17), length 33)
192.168.56.1.62439 > 192.168.56.101.54321: UDP, length 5
22:33:21.282140 IP (tos 0x0, ttl 64, id 40761, offset 0, flags [DF], proto UDP (17), length 33)
192.168.56.101.54321 > 192.168.56.1.62439: UDP, length 5
笔记:可以对上述技巧进行大量修改,以调试 socat/nc 服务器与其客户端之间发生的任何情况。
理解 socat 论证
我也找到了配置socat
筋疲力尽有时。但就像其他事情一样,如果你把它分解成更小的部分,它就更容易掌握。
$ socat -v udp4-datagram:172.24.176.116:54321 \
open:/dev/ttyUSB0,raw,nonblock,waitlock=/tmp/s0.locak,echo=0,b115200,crnl
所以前两个开关应该有点明显:
-v
- 冗长udp4-datagram:172.24.176.207:54321
- UDP监听端口54321open:/dev/ttyUSB0
- 设置发送输入/输出到您的 USB #0 设备raw
- 原始模式,传递未处理的输入/输出nonblock
- 以非阻塞模式打开/使用文件waitlock=/tmp/s0.locak
- 创建一个等待锁文件 - 防止socat
多个echo=0
- 禁用服务器上的本地回显b115200
- 将波特率设置为 115,200 位crnl
- 将换行符从 转换\n
为\r\n
顺便说一句,如果您查看socat
手册页,会有很多示例。还有上述开关的完整描述。