Потоковая передача 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 -

Любые идеи?


person Dan1676    schedule 29.11.2011    source источник


Ответы (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

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

person This    schedule 29.11.2011
comment
Насколько я понял, предлагаемое решение состоит в том, чтобы передать весь файл, дождаться завершения передачи и затем воспроизвести файл. На самом деле это не потоковая передача, а просто копирование файлов. Для приложений, где вам нужно видео в реальном времени, TCP-решение работает, а UDP-нет. - person gstorto; 18.12.2017