Netcat потоковая передача по UDP - PullRequest
10 голосов
/ 29 ноября 2011

Я могу получить 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 Ответ

13 голосов
/ 29 ноября 2011

Существует принципиальная разница между потоковыми байтами с 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

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

...