我試圖檢測使用多播從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)和答案。 –