如何使用 socat 发送和接收 UNIX 数据报?

如何使用 socat 发送和接收 UNIX 数据报?

我需要使用 socat 将 UNIX 数据报发送到正在运行的应用程序中的开放端口。当应用程序收到数据报时,它将用另一个数据报进行回复。

我需要执行此操作才能在 Bash 脚本中获取结果数据报。我发现几乎有效的方法是:

socat - UNIX-CLIENT:/tmp/app-port.sock

app-port.sock作为守护进程运行的应用程序的监听端口在哪里。

通过使用,-我可以从 STDIO 发送数据报,通过键盘,最后按 ENTER。在应用程序日志中,我看到数据报被正确接收,但没有源套接字/端口(空),因此应用程序无法回复,因为它不知道是谁发送了收到的数据报。

关于如何使用适当的源套接字地址发送数据报并接收答案有什么线索吗?

答案1

我是如何做到的:

echo 'INPUT_DATAGRAM' | socat -b 256000 - UNIX-SENDTO:/tmp/dest.sock,bind="/tmp/source.sock"

-b 选项是缓冲区大小,默认值可能是 8 KB,响应数据报会被修剪。因此我配置了一个大得多的缓冲区以避免被修剪,并且成功了。

显然,通过这种方式调用,shell 会等待第一个数据报的响应,在屏幕上打印(stdout),然后关闭(在交互模式下不会持续)。这正是我想要的,所以对我来说一切都没问题。

如果服务器在响应中延迟了几秒钟,您可能需要使用 -T 选项更改默认超时。例如,超时为 5 秒:

echo 'INPUT_DATAGRAM' | socat -T 5 -b 256000 - UNIX-SENDTO:/tmp/dest.sock,bind="/tmp/source.sock"

我使用 UNIX-SENDTO 而不是 UNIX-CLIENT,因为此方法似乎在命令完成后释放套接字。

相关内容