0

我正在使用这段代码来发送和接收数据,问题是我没有收到任何东西..

代码:

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)..

有人可以告诉我我在这里做错了什么吗?

谢谢

4

2 回答 2

0

第一个问题:使用Connection#send_datagram代替Connection#send_data

“不要从 EventMachine::Connection#receive_data 方法之外的数据报套接字调用 send_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}"
}
于 2012-11-09T06:44:05.300 回答
0

这就是我让 EventMachine 设置数据报套接字并侦听 SSDP 公告的方式。

改变:

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


.....
于 2012-12-03T12:51:04.103 回答