首页 > 解决方案 > 如何从主机 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 发送消息。我只是无法在虚拟机上接收。

标签: pythonnetworkingvmwarecentos7multicast

解决方案


推荐阅读