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

UDPSocketRubyとまったく同じメッセージを送信している場合、データを受信します(UDPSocketEMからではなく、から)。

誰かが私がここで間違っていることを教えてもらえますか?

ありがとう

4

2 に答える 2

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 に答える
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

2 番目の問題は、マルチキャスト アドレスの使用に関連しているようです。以下は私にとってはうまくいきます。

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 に答える