2012-11-08 140 views
0

我使用這段代碼來發送和接收數據,問題是我沒有收到任何東西..EventMachine的不超過數據報套接字接收數據

代碼:

US_HOST = "239.255.255.250" 
US_PORT = 1900 

module SSDP 
    class Client < EventMachine::Connection 
    def receive_data data 
     p "Received some data:" 
     p data 
    end 
    end 
end 

us = EM.open_datagram_socket US_HOST, US_PORT, SSDP::Client 

us.send_data msg 

def msg 
<<-MSEARCH 
M-SEARCH * HTTP/1.1\r 
HOST: #{US_HOST}:#{US_PORT}\r 
MAN: ssdp:discover\r 
MX: 1\r 
ST: ssdp:all\r 
\r 
MSEARCH 
end 

如果我送與Ruby的UDPSocket完全相同的消息我接收數據(從UDPSocket,而不是從EM)..

有人能告訴我,我做錯了什麼嗎?

感謝

回答

0

我這是怎麼了EventMachine的設置數據報套接字和監聽SSDP announcments。

變化:

us = EM.open_datagram_socket(US_HOST, US_PORT, SSDP::Client) 

要:

us = EM.open_datagram_socket('0.0.0.0', US_PORT, SSDP::Client) 

你有實際綁定到你的IP地址,而不是多播地址。然後在你的客戶端類中添加一個構造函數,告訴套接字加入SSDP的多播組。

class Client < EventMachine::Connection 

def initialize 
    puts "Socket setup" 
    set_sock_opt(Socket::IPPROTO_IP, Socket::IP_ADD_MEMBERSHIP, 
       IPAddr.new('239.255.255.250').hton + 
       IPAddr.new('0.0.0.0').hton) 
end 


..... 
+0

我看到的完全不同的方法..當我回家後我會試試這個,並且會讓你知道!謝謝! –

+0

試過了,它的工作原理! –

+0

我很高興你有它的工作! – Patrik

0

第一個問題:使用Connection#send_datagram代替Connection#send_data

「不要從數據報套接字一個EventMachine的::連接#receive_data方法之外調用SEND_DATA使用EventMachine的::連接#send_datagram。」 http://rubydoc.info/gems/eventmachine/1.0.0/EventMachine#open_datagram_socket-class_method

第二個問題似乎與使用多播地址有關。以下對我有用。

require "eventmachine" 

US_HOST = "127.0.0.1" 
US_PORT = 1900 

module SSDP 
    class Client < EventMachine::Connection 
    def receive_data data 
     warn "recv: #{data.inspect}" 
    end 
    end 
end 

def msg 
<<-MSEARCH.gsub(/^\s+/,"") 
    M-SEARCH * HTTP/1.1\r 
    HOST: #{US_HOST}:#{US_PORT}\r 
    MAN: ssdp:discover\r 
    MX: 1\r 
    ST: ssdp:all\r 
    \r 
MSEARCH 
end 

EM.run { 
    us = EM.open_datagram_socket(US_HOST, US_PORT, SSDP::Client) 
    us.send_datagram(msg, US_HOST, US_PORT) 
    warn "sent: #{msg.inspect}" 
} 
+0

謝謝您的回答,我也試過send_datagram,對我也沒有工作..大概是因爲多播地址的..你做什麼我的意思的作品,你發現在UPnP設備的家庭網絡與此?當我回家時我會測試這個! PS:MSEARCH消息中的「gsub」是什麼?謝謝! –

+0

這確實有效..但是對於UPnP,我需要在239:255:255:250:1900上工作。所以,我不知道爲什麼它不適用於該IP,但我需要anothor解決方案才能繼續.. –