socat как клиент должен переподключиться к серверу и продолжить использовать тот же pty файл - PullRequest
0 голосов
/ 06 декабря 2018

Я использую 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

Еще раз спасибо

1 Ответ

0 голосов
/ 07 декабря 2018

Хорошо, это то, что мы придумали (протестировано и работает):

#!/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 дважды, с двумя файлами.

Второй сокат читает с сервера в файл 1.

Первый сокат читает из файла 1 в файл 0.

Процесс чтения читает данные из файла 0.

Два файла всегда есть, и процесс чтения всегда может читать из одного и того же файла, независимо от перезапуска любого сервера.

Комплименты для GC для этого решения.

...