Netcat使用UDP进行数据流传输

10

我可以使用TCP让netcat流式传输视频

  {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

TCP和UDP在流传输字节方面有根本的区别...

  • TCP在字节流结束时会发出EOF通知
  • UDP则只是停止发送数据(即它不会通知另一端数据停止)

结果是您的TCP示例可以工作,但UDP示例不能,因为mplayer永远不知道何时处理收到的字节。

解决此问题的一种方法是在两端都设置超时... 首先使用定时完成启动客户端(在子shell中后台运行nc部分,这样它就不会阻塞):

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

接下来启动你的服务器...在这种情况下,我展示了将文件推送到udp/65535上的192.168.12.238

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

最后,确保你选择的超时时间足够长,以便对Shell命令进行排序并完成网络传输(如果你在有线以太网局域网上,这通常相当快)。


据我所理解,提出的解决方案是传输整个文件,等待传输完成,然后播放文件。这不是真正的流媒体,只是文件复制。 对于需要实时视频的应用程序,TCP解决方案有效,但UDP解决方案无效。 - gstorto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接