2012-11-08 100 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解决方案才能继续.. –