2012-11-08 2 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 

Если Я посылаю точно такое же сообщение с Руби UDPSocket я сделать прием данных (от UDPSocket, а не от ЭМ) ..

Может кто-нибудь сказать мне, что я делаю неправильно здесь?

Благодаря

ответ

0

Вот как я получил EventMachine для установки сокета datagram и прослушивания анонсов SSDP.

Изменение:

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

To:

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

Im рад, что вы получили его на работу! – Patrik

0

Первая проблема: использование Connection#send_datagram вместо Connection#send_data

"НЕ называть send_data из сокета дейтаграммы за пределами EventMachine :: Подключение метода # receive_data Использование EventMachine :: Connection # 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, не работает для меня либо .. Наверное, из-за MultiCast адрес .. Что вы имеете в виду работ для меня, вы найдете UPnP устройств в домашняя сеть с этим? Я проверю это, когда вернусь домой! PS: Что такое 'gsub' в сообщении MSEARCH? Благодаря! –

+0

Это действительно работает. Но для UPnP мне нужно работать с 239: 255: 255: 250: 1900 .. Итак, я не знаю, почему это не работает с этим IP-адресом, но мне нужно решение для решения .. –

Смежные вопросы