我正在使用一个需要与远程串行 (rs-232) 设备通信的 linux 应用程序。我已经研究出如何在远程端使用 socat 通过 IP 连接发送设备的串行数据,但是我如何将该 IP 流转换回(伪)串行设备字符设备(例如 /dev/fakesocatserial0)另一方面?
我有一个场景,同一个盒子上的多个进程想要与串行设备通信。进程A需要与串口进行双向通信,进程B只需要能够写入串口即可。串口设备不断地喷出数据,而两个进程则周期性地写入端口。环境是 Windows 上的 Cygwin(进程是 Windows 进程),但是如果有人有仅 Linux 的解决方案,则可以将串行端口移动到 *nix 虚拟机。
我的“网络图”如下:
/--<->--[Process A]
[serial device]-ttyS0--<->--[socat]-udp-<
\--<<<--[Process B]
Run Code Online (Sandbox Code Playgroud)
我的第一次尝试是使用 udp-recvfrom 和 fork 选项设置 socat 实例。这适用于第一个数据包 - 一个进程从 socat 分叉,将数据发送到串行设备,并开始从串行设备读回数据。然而,这个分叉的进程现在已经为读写打开了串口,所以没有更多的分叉成功启动。
任何人都可以想出任何方法来让它发挥作用吗?我可以想到以下途径,但我还没有找到使它们工作的设置:
我有一个场景,我向我的团队@work 演示了如何使用socat
. 该小组希望能够通过以太网与串行设备建立按需双向连接。目前我有通过 Telnet 广播的设备。
socat tcp-l:23,reuseaddr,fork,crlf file:/dev/ttyUSB0,echo=0,b115200,raw,crnl,icanon=1
Run Code Online (Sandbox Code Playgroud)
我需要设置消费者端,使 Windows 用户连接到 Telnet 端口,但将 I/O 重定向到他们机器上的可用 COM 端口。我在考虑 Cygwin &socat
在 Windows 方面,但我不是一个非常熟练的 Windows 人。
有任何想法吗?
我正在摆弄 socat,并尝试使用 socat 创建一个 TUN 设备,用于在两个 debianstretch 服务器之间建立隧道。然而,吞吐量似乎非常低,与本地主机上的 TCP/TCP-Listen 的 iperf 相比,TUN 的吞吐量大约低 5 个数量级。
这是一个“最小工作示例”,显示速度如何受到影响。
# socat
socat TUN:10.10.0.2/16,iff-up TCP4-LISTEN:54321,bind=192.168.1.2,fork
# iperf service
iperf -s -p 15001 -B 10.10.0.2
Run Code Online (Sandbox Code Playgroud)
# socat
socat TUN:10.10.0.1/16,iff-up TCP4:192.168.1.2:54321
# iperf
iperf -c 10.10.0.2 -p 15001 -t 30
Run Code Online (Sandbox Code Playgroud)
# socat
socat TCP4-LISTEN:12345,bind=192.168.1.2,fork TCP4:127.0.0.1:15001
# iperf service
iperf -s -p 15001 -B 127.0.0.1
Run Code Online (Sandbox Code Playgroud)
# socat
socat TCP4-LISTEN:54321,bind=127.0.0.1,fork TCP4:192.168.1.2:12345
# iperf
iperf -c 127.0.0.1 -p …
Run Code Online (Sandbox Code Playgroud) 我正在努力尝试了解如何使用 socat(或类似的 TCP 端口重定向器)在 PC 上公开防火墙服务。
这是场景:我有一台服务器 PC,它将充当两台客户端计算机之间的侦听“代理”/重定向器。服务器可以根据需要打开任意数量的防火墙端口,并有一个公共 IP。在第一个“客户端”(如建立到代理服务器的出站连接)客户端 A 上,我在端口 4200 上托管服务。这台 PC 位于防火墙后面,该防火墙仅允许基于先前出站连接的入站 TCP 连接。Client B 后面的防火墙也是如此。
我需要做的是让客户端 B 能够通过面向 Internet 的 TCP 代理服务器访问客户端 A 上的端口 42000。问题是我只能从客户端 A 启动出站 TCP 连接。当中继的两个客户端都位于只允许出站连接的防火墙之后时,我如何通过服务器重定向 TCP 连接?请查看下图并让我知道是否需要澄清。
------------
| Server |
|w/ public IP|
------------
/ \
{|<Firewall>|} {|<Firewall>|}
| |
---------- ----------
| Client A | | Client B |
---------- ----------
(hosting a service (wanting to access
on port 4200) Client A port 4200)
Run Code Online (Sandbox Code Playgroud)
我将不胜感激任何建议,谢谢。
关于 Netcat/Socat 实用程序。从手册页来看,似乎可以使用 netcat 创建一个安全代理,通过它我可以将我的网络浏览器指向代理服务器,它可以通过代理分叉/驱动我的网络流量。这可能吗?关于如何执行此操作有任何提示吗?Windows 上的 Socat 更好,但 Linux 上的 netcat 也可以。
我正在尝试构建一个快速脚本,用于侦听一个 UDP 数据包,将其存储到文件中,然后退出。
索卡特来救援!
$ socat UDP-RECVFROM:9999 CREATE:/tmp/results_9999
2016/04/08 11:56:59 socat[1955] E read(6, 0x5220d3d0020, 8192): Bad file descriptor
Run Code Online (Sandbox Code Playgroud)
啊?
该文件包含收到的数据包:
$ cat /tmp/results_9999
SUCCESS on Port 9999
Run Code Online (Sandbox Code Playgroud)
strace 似乎显示它试图读取写入的文件:
recvfrom(5, "SUCCESS on Port 9999\n", 8192, 0, {sa_family=AF_INET, sin_port=htons(34032), sin_addr=inet_addr("192.168.56.102")}, [16]) = 10
recvfrom(3, 0x78ea087b3700, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(3, 0x78ea087b3d40, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
write(6, "SUCCESS on Port 9999\n", 10) = 10
recvfrom(3, 0x78ea087b3d40, 519, 64, 0, …
Run Code Online (Sandbox Code Playgroud)