我正在尝试在一台机器上接收多播,将其转发到另一台机器,然后在该机器上重播。
test_env
:可以访问原始多播流的机器mcast_sender
:我试图将多播转发到并重新多播的机器
到目前为止我已经尝试过:
结合tcpdump
,我尝试了以下方法netcat
:tcpreplay
上test_env
:
我有一个 python 脚本,它执行 IGMP 连接并永远坐在那里,从套接字读取并丢弃数据(只是保持套接字打开)
$ ./mcast_sub INADDR_ANY 239.194.5.1 21001 &
现在有问题的接口将接收多播数据,所以我可以运行tcp_dump
:
$ sudo tcpdump -i eth5 host 239.194.5.1 > /tmp/capture.pcap
我现在可以tail
在 pcap 文件上运行,并将其通过管道传输到netcat
$ tail -f /tmp/capture.pcap -n+1 | nc -l 12345
上mcast_sender
:
然后,我mcast_sender
可以从 netcat 端口接收这些数据,并将其转储到那里的本地文件中:
$ nc test_env 12345 > /tmp/capture.pcap
然后使用tcpreplay
我可以读取捕获文件mcast_sender
并重播它
$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap
我的问题:
-管道似乎正在工作tcpdump
。netcat
我已经验证我正在写一个文件mcast_sender
。
但是,当我尝试tcpreplay
在其上运行时,出现错误:
$ sudo tcpreplay --intf1=eth8 /tmp/capture.pcap
Failed: Error opening pcap file: unknown file format
问题:
- 有可能做我在这里尝试的吗?
- 为什么写入的文件
mcast_sender
无效? - 有没有更好的方法来实现我在这里想要做的事情?
这不起作用,因为您需要将 tcpdump 的标准输出设置为行缓冲
来自
man tcpdump
:您还可以取消中间文件并
netcat
通过将输出tcpdump
直接传递到tcpreplay
.这是通过
tcpdump
在 ssh 会话上运行、将输出转储到 stdout 并将其通过管道传输到 stdin 来实现的tcpreplay
:通过 ssh 会话运行命令:
运行
tcpdump
并输出到标准输出,行缓冲:从标准输入运行
tcpreplay
读取:把它们放在一起: