2017-04-10 25 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時,它就開始工作了。

相關問題