2017-04-10 91 views
0

我试图检测使用多播从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 
+0

您的计算机上是否有订阅多播地址的进程?许多交换机执行IGMP侦听,并且它们不会将组播传送到主机未订购组播组的接口。还有一个知道IGMP侦听问题的两台交换机和没有mrouter。 –

+0

不,不存在监听该端口或地址的服务。由于Linux机器上的Wireshark/tcpdump发现该包,它必须由交换机交付给接口。主网络上有一个路由器,当然这个设备连接的小型网络只有一个交换机。 IGMP snooping问题适用于什么情况?它涉及什么? –

+0

多播与您的普通单播网络不同。希望接收多播的进程必须通过发送IGMP消息来请求多播组,请求将该组的流量发送给它。过去,交换机只是按照广播的方式将组播发送到每个接口。 IGMP侦听已经改变了这种情况,交换机只发送组播到主机发送IGMP加入的接口。交换机不会互相发送IGMP,因此您需要一台mrouter或IGMP查询器。看[这个问题](http://networkengineering.stackexchange.com/q/283​​01/8499)和答案。 –

回答

0

我到底想通了这个问题。尽管我见过的所有代码示例都是这样说的,但似乎无法将地址'0.0.0.0'绑定到多宿主机器上的所有接口。我不知道这是否曾经工作过并且已被更改,或者我发现所有示例都只在单机上测试过,但是当我将套接字绑定到正确接口的实际IP时,它就开始工作了。

相关问题