我试图检测使用多播从Ruby程序的网络连接的设备接收。我从官方检测程序中嗅探到网络流量,发现计算机向225.0.0.37:12345发送数据包,设备在225.0.0.38:12346响应。该设备连接到由Netgear交换机,Windows计算机和Linux计算机组成的本地网络。我已经让我的程序发出了一个和官方程序一样的相同数据包。组播分组见于Wireshark的,但不能被用户程序(Windows和Linux)
我的问题是,响应没有收到,既不是我的计划,也没有官方的检测程序。使用Wireshark,我可以清楚地看到设备响应,而且数据包明显地显示在运行Wireshark的Linux计算机上,但在Windows计算机上运行的官方程序和运行在Linux计算机上的我自己的Ruby程序都无法获得响应。
我的两个计算机有两个网络适配器,一个连接到同一个本地交换机和一个连接到另一台交换机,然后将其连接到一个大的局域网与互联网连接。我试过在计算机之间使用不同品牌的开关,但它没有任何区别。
我已经搜查甚广的互联网,并没有发现任何解决我的问题。我感谢任何帮助,我可以得到。
下面是使用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
您的计算机上是否有订阅多播地址的进程?许多交换机执行IGMP侦听,并且它们不会将组播传送到主机未订购组播组的接口。还有一个知道IGMP侦听问题的两台交换机和没有mrouter。 –
不,不存在监听该端口或地址的服务。由于Linux机器上的Wireshark/tcpdump发现该包,它必须由交换机交付给接口。主网络上有一个路由器,当然这个设备连接的小型网络只有一个交换机。 IGMP snooping问题适用于什么情况?它涉及什么? –
多播与您的普通单播网络不同。希望接收多播的进程必须通过发送IGMP消息来请求多播组,请求将该组的流量发送给它。过去,交换机只是按照广播的方式将组播发送到每个接口。 IGMP侦听已经改变了这种情况,交换机只发送组播到主机发送IGMP加入的接口。交换机不会互相发送IGMP,因此您需要一台mrouter或IGMP查询器。看[这个问题](http://networkengineering.stackexchange.com/q/28301/8499)和答案。 –