Потоковая передача 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 никогда не знает, когда обрабатывать полученные байты.

Один из способов решения этой проблемы - с тайм-аутом с обеих сторон... Сначала запустите свой клиент с тайм-финишем (фоновая часть 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

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