У меня есть приложение UDP только для IPv4, прослушивающее порт 624. Я создал интерфейс IPv6/IPv4 с socat, прослушивая порт 625. Теперь я могу использовать адрес сервера IPv4 или IPv6 для доступа к приложению только для IPv4. Круто, пока!

socat UDP6-LISTEN:625,fork,su=nobody UDP4:localhost:624 &

После отправки всего одного UDP-сообщения, IPv4 в приведенном ниже примере, я вижу два новых долгоживущих процесса, по одному для каждой стороны шлюза.

# lsof -i:624 -i:625 -n -P -i:625
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
myap     4296   root    4u  IPv4   7845     0t64  UDP *:624
socat   28597 nobody    3u  IPv6  67603     0t64  UDP 192.168.93.90:625->192.168.90.121:34091
socat   28597 nobody    4u  IPv4  67882     0t64  UDP 127.0.0.1:53648->127.0.0.1:624

Как вы можете себе представить, для занятого сервера число долгоживущих процессов быстро растет.

Как я могу использовать socat для предоставления функции шлюза и очистки этих долгоживущих процессов UDP?

1 ответ1

0

Я нашел то, что мне нужно, на странице справки socat ...

Ответ заключается в том, чтобы установить тайм-аут для связи на основе UDP.

-T<timeout> Общее время бездействия: когда socat уже находится в цикле передачи и ничего не происходило в течение <timeout> [timeval] секунд (данные не поступали, прерывание не происходило ...), затем оно завершается. Полезно с такими протоколами, как UDP, которые не могут передавать EOF.

Таким образом, командная строка должна стать (на 5 секунд тайм-аут):

socat -T5 UDP6-LISTEN:625,fork,su=nobody UDP4:localhost:624 &

Мэтт.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .