2015-01-19 2 views
5

Это COMAND (последовательный порт редиректор) принимает одно соединение по протоколу TCP: 11313:SOCAT завершается после того, как соединение близко

socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr 

Однако, когда соединение потеряно, описанный выше процесс Сокат убит и клиент не может для подключения.

Я могу решить эту проблему, добавив опцию fork в конце указанной выше команды. Но тогда несколько клиентов смогут подключиться. Но я хочу принять только одно соединение.

Любые идеи, как достичь этого?

+0

Может быть ser2net (http://ser2net.sourceforge.net/) является то, что вам нужно? – Maquefel

+0

@Maquefel у вас есть опыт работы с ser2net. Для меня похоже, что они делают то же самое. –

+1

У меня есть - ser2net - это специализированная вещь, которую он не может делать большинством вещей, таких как socat, разработанный специально для пересылки серийного номера в ethernet. Но он ведет себя так, как вы хотите - один порт - одно соединение, не выходит, когда соединение закрыто, и уведомляет о новом входящем соединении о используемом порту. – Maquefel

ответ

7

Вы можете ограничить число детей с max-children вариант:

LISTEN группе опций опции, характерные для прослушивания сокетов

Макс-дети = Ограничивает число параллельных дочерних процессов [INT] , По умолчанию нет предела.

С помощью этого вы можете ограничить количество клиентов, которые могут взаимодействовать с PTY, но не будут препятствовать подключению других. Остальные будут просто стоять в очереди до тех пор, пока первое соединение не будет закрыто. Если вы хотите, чтобы предотвратить это, я хотел бы предложить, чтобы просто обернуть вызов SOCAT в while true; do ..; done цикле:

while true; do 
    socat PTY,link=/dev/ttyV1,echo=0,raw,unlink-close=0 TCP-LISTEN:11313,forever,reuseaddr 
done 
+1

лучше использовать 'while sleep 1; делать .. ; done, потому что некоторые оболочки не могут корректно обрабатывать сигнал SIGINT в этом цикле, и вы можете или не можете правильно прервать цикл –

+0

Итак, я должен заменить «..» моей командой socat? –

+1

Да. Я обновил ответ с помощью точной команды. Фрагмент запускает socat в бесконечном цикле, перезагружая его сразу же после его выхода. Если вы никогда с ними не работали, подумайте о подсказке Габора и замените «true» на 'sleep 1' для стартеров. – Phillip

Смежные вопросы