Потоковая передача Netcat с использованием UDP

Я могу заставить netcat транслировать видео с помощью TCP

  {server}  cat [movie].avi | nc [client ip address] 65535

  {client}  nc -l -p 65535 | mplayer -

Я попытался использовать команду-u для отправки через UDP, но это не работает

  {server}  cat [movie].avi | nc -u [client ip address] 65535

  {client}  nc -u -l -p 65535 | mplayer -

какие идеи?

1 ответов


существует фундаментальная разница между потоковыми байтами с TCP и UDP...

  • TCP передает EOF, когда он видит конец потока байтов
  • UDP просто перестает отправлять данные (т. е. он не уведомляет другой конец остановки данных)

последствия таковы, что ваш пример TCP работает, но пример UDP не работает, потому что mplayer никогда не знает, когда обрабатывать байты, которые он получает.

один из способов решить это с таймаутом с обеих сторон... Сначала запустите свой клиент с синхронизированным финишем (backgrounding часть nc в подрешетке, чтобы она не блокировалась):

(nc -q 1 -u -l -p 65535 > [movie].avi&); sleep 10; fuser -k 65535/udp;\
    mplayer [movie].avi; rm [movie].avi

далее запустите сервер... в этом случае я показываю, что он нажимает файл на 192.168.12.238 на udp / 65535

(cat [movie].avi | nc -u 192.168.12.238 65535&); sleep 10; \
    fuser -n udp ,192.168.12.238,65535 -k

наконец, убедитесь, что вы выбрали тайм-аут, достаточный для последовательности команд оболочки и завершения сетевой передачи (что обычно довольно быстро, если вы находитесь на проводной локальной сети ethernet).