Ruby Wireshark中看到的多播数据包,但用户程序(Windows和Linux)未接收到

Ruby Wireshark中看到的多播数据包,但用户程序(Windows和Linux)未接收到,ruby,linux,networking,multicast,Ruby,Linux,Networking,Multicast,我正在尝试使用Ruby程序中的多播来检测连接到网络的设备。我嗅探了官方检测程序的网络流量,发现计算机发送一个数据包到225.0.0.37:12345,设备响应225.0.0.38:12346。该设备连接到由Netgear交换机、Windows计算机和Linux计算机组成的本地网络。我已经制定了我的程序,发送与官方程序相同的数据包 我的问题是,无论是我的程序还是官方的检测程序都从未收到响应。使用Wireshark,我可以清楚地看到设备毫无故障地响应,数据包清晰地发送到我运行Wireshark的Li

我正在尝试使用Ruby程序中的多播来检测连接到网络的设备。我嗅探了官方检测程序的网络流量,发现计算机发送一个数据包到225.0.0.37:12345,设备响应225.0.0.38:12346。该设备连接到由Netgear交换机、Windows计算机和Linux计算机组成的本地网络。我已经制定了我的程序,发送与官方程序相同的数据包

我的问题是,无论是我的程序还是官方的检测程序都从未收到响应。使用Wireshark,我可以清楚地看到设备毫无故障地响应,数据包清晰地发送到我运行Wireshark的Linux计算机上,但Windows计算机上运行的官方程序和Linux计算机上运行的我自己的Ruby程序都没有得到响应

我的两台计算机都有两个网络适配器,一个连接到同一个本地交换机,另一个连接到另一个交换机,然后再连接到一个可以访问internet的大型LAN。我试过在两台电脑之间使用不同品牌的开关,但没什么不同

我在互联网上到处搜索,没有找到任何解决我问题的方法。我很感激能得到的任何帮助

以下是使用tcpdump捕获的相关数据包,第一个是从我的程序发送的,第二个是来自设备的响应:

13:30:25.773019 IP 192.168.0.1.12345 > 225.0.0.37.12345: UDP, length 15
13:30:25.773770 IP 192.168.0.125.39129 > 225.0.0.38.12346: UDP, length 228
以下是我的程序中的一个简化片段:

MULTICAST_SEND_ADDRESS = '225.0.0.37'
MULTICAST_SEND_PORT = 12345
MULTICAST_RESPONSE_ADDRESS = '225.0.0.38'
MULTICAST_RESPONSE_PORT = 12346
BIND_ADDRESS = '0.0.0.0'

# Transmit packet on all adapters - this part works fine
packet = [ID_STRING].pack("Z*")
addresses = Socket.ip_address_list
addresses.each do |addr|
    next unless addr.pfamily == Socket::PF_INET
    socket = UDPSocket.new
    socket.bind(addr.ip_address, MULTICAST_SEND_PORT)
    socket.setsockopt(Socket::SOL_SOCKET, Socket::SO_BROADCAST, true)
    socket.send(packet, 0, MULTICAST_SEND_ADDRESS, MULTICAST_SEND_PORT)
    socket.close
end

# Receive packet - this should work, but doesn't
membership = IPAddr.new(MULTICAST_SEND_ADDRESS).hton + IPAddr.new(BIND_ADDRESS).hton
listen_socket = UDPSocket.new
listen_socket.setsockopt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, membership)
listen_socket.bind(BIND_ADDRESS, MULTICAST_RESPONSE_PORT)
packet, addr = listen_socket.recvfrom(1024)
# We never get to this line since there's nothing received
puts packet

我最终解决了这个问题。不管我看到的所有代码示例都说了些什么,似乎您无法绑定到地址“0.0.0.0”来获取多主机机器上的所有接口。我不知道这是否曾经有效,是否已被更改,或者我发现的所有示例仅在单主机上进行过测试,但当我将套接字绑定到正确接口的实际ip时,它开始工作。

您的计算机上是否有订阅多播地址的进程?许多交换机进行IGMP侦听,它们不会将多播传送到主机尚未订阅多播组的接口。还有一个已知的IGMP侦听问题,即两个交换机和没有mrouter。不,没有正在运行的侦听该端口或地址的服务。由于Linux机器上的Wireshark/tcpdump可以看到包,因此必须通过交换机将包传递到接口。主网络当然在线路的某个地方有一个路由器,而设备连接的小网络只有一个交换机。IGMP窥探问题具体应用于什么场景?它需要什么?多播与普通单播网络不同。希望接收多播的进程必须通过发送IGMP消息来订阅多播组,请求向该组发送通信量。交换机过去只是以广播的方式向每个接口发送多播。IGMP侦听已经改变,因此交换机只向主机发送IGMP连接的接口发送多播。交换机之间不发送IGMP,因此您需要一个mrouter或IGMP查询器。我想我明白了,但如果是这样的话,Wireshark就不应该得到这个包了。另外,我忘了提到的是,我的程序通过多播检测其他设备没有问题。255.255.255.255地址是有限的广播地址,而不是多播地址。广播传送到每个交换机接口。