首页 > 解决方案 > socat 作为客户端必须重新连接到服务器并继续使用相同的 pty 文件

问题描述

我正在使用 socat 连接到服务器并将传入的数据传输到另一个进程可以读取的文件。这是单向数据(从服务器到接收进程)。

因为当我的服务器出现故障或断开连接时 socat 会退出,所以我使用了一个循环,以便 socat 可以重新连接。我的代码如下。

问题是当 socat 重新连接时,它还会打开一个新文件来写入数据,从 dev/pts/0 到 dev/pts/1,可能是因为我的接收进程仍然打开文件以供读取。

读取过程不知道文件更改,因此无法读取进入新文件的数据。

有没有办法让 socat 在重新连接后继续写入同一个文件?

或者其他可以更好地处理服务器重新连接的方法?

谢谢

我已经在这里咨询过类似的话题:

网络故障后重新连接socat连接

但这是一个稍微不同的问题。

我也尝试过使用 fork 方法,但是当我只需要一个连接时,我最终会连接到服务器的多个子进程。(我怀疑 fork 方法是用于 socat 作为服务器,而不是作为客户端)。

我的代码在这里:

#!/bin/bash
file="/dev/ttyv0"
while :
do
    if [ -f "$file" ];then
        cho "$file found,go to connect"
    else
        socat -d -d -U  pty,link=/dev/ttyv0,raw,crnl tcp:192.168.0.161:9800
    fi
done

再次感谢

标签: linuxsocat

解决方案


好的,这就是我们想出的(测试和工作):

#!/bin/bash

socat pty,link=/dev/ttyv0,raw,crnl pty,link=/dev/ttyv1,raw,crnl

while true 
do
        socat  -U open:/dev/ttyv1,raw,nonblock tcp:192.168.0.161:9800,forever
done

我们最终运行 socat 两次,有两个文件。

第二个 socat 从服务器读取文件 1。

第一个 socat 从文件 1 读入文件 0。

阅读器进程从文件 0 中读取数据。

这两个文件始终存在,并且无论任何服务器重新启动,阅读器进程都可以始终从同一个文件中读取。

对这个解决方案的 GC 表示赞赏。


推荐阅读