python - 如何从主机 windows PC 到 VM Centos7 获取多播数据包?
问题描述
我正在尝试使用多播进行测试,我有几个关于如何实现这一点的问题。
首先,如果两个系统在同一个子网(即 10.10.1.10 和 10.10.1.12)下,我是否绝对有必要拥有一台路由器来完成多播,或者我可以只拥有一个交换机甚至点对点连接吗?我会说不,因为我已经进行了一些测试,但很高兴知道这一点。
其次,如果可能的话,我如何在我的 Windows 10 PC 和同一台 PC 上运行 CentOS7 的 VMWare 之间建立多播连接?
我现在拥有的:
一个与我的外部连接有桥接网络并运行 CentOS7 的 VMWare。VM 的 IP 为 10.10.1.12,网络掩码为 255.255.255.0,windows 的 IP 为 10.10.1.10,网络掩码为 255.255.255.0。
我已经根据我发现在 VM 上运行的东西编写了一个接收 python 脚本
import socket
import struct
MCAST_GRP = '224.0.0.71'
MCAST_PORT = 1000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sock.bind(('', MCAST_PORT))
mreq = struct.pack("4sl", socket.inet_aton(MCAST_GRP), socket.INADDR_ANY)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_ADD_MEMBERSHIP, mreq)
while True:
print sock.recv(10240)
以及从我的主机 PC 发送的 python 脚本
import socket
MCAST_GRP = '224.0.0.71'
MCAST_PORT = 1000
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, 2)
sock.sendto("robot", (MCAST_GRP, MCAST_PORT))
在我的 CentOS7 VM 上,我可以看到接收脚本正在通过运行注册到组
netstat -g
我还可以通过运行查看传入的数据包
sudo tcpdump -i <NIC> host 224.0.0.0/4
这表明
14:28:03.111837 IP 10.10.1.101.60007 > 224.0.0.71.cadlock2: UDP, length 26
我也可以在 Wireshark 中看到它作为传入的 UDP 消息,但是我运行的 python 接收脚本没有接收到它。
我还将 net.ipv4.all.rp_filter 设置为 0,这是我在研究时看到的,但没有。
但是,我可以在 Windows PC 上运行发送和接收脚本并很好地接收它们。我什至可以在 Wireshark 中看到它们,它们显示为 IP 10.10.1.101 到 224.0.0.71 IPV4mcast。
我也可以很好地从 VM 向主机 PC 发送消息。我只是无法在虚拟机上接收。
解决方案
推荐阅读
- npm - 如何在 npm 中创建多个包?
- base64 - Base64 编码 OpenType 字体使用数据 URI,从计算机动态输入用户
- java - 我正在尝试安装我克隆的 apache-storm 存储库。并且在到达storm-client 时收到以下错误。如何解决这个问题?
- javascript - 超时时如何阻止NodeJS脚本崩溃
- indexing - Hibernate search 监控索引进程
- oracle - 使用编译错误创建的触发器。无法找出错误
- python - Python ImportError:没有名为 sty 的模块
- php - 为什么我收到未定义的索引消息
- python - 如何覆盖之前打印语句中已经打印出来的数组元素?
- java - 如何在没有时间的情况下将公历日期转换为伊斯兰(回历)日期?