を使用します。つまり、コードスニペットが機能します。二open_datagram_socket
がコメント解除されている場合は、このエラーで失敗します:私は<a href="http://rubyeventmachine.com/" rel="nofollow">EventMachine</a>とUDPの接続に設定されたソケットオプション(特にSO_REUSEADDR)をしようとしています(UDP経由)EventMachineでSO_REUSEADDR
eventmachine.rb:844: `open_udp_socket '内:なしグラムソケット(例外RuntimeError)
をソースを見てから、それはそれのように見えます失敗した場合はnullを返しますが、それは驚くべきことではありません。ソケットオプションが正しく設定されていないようですが、何か間違っているかどうかを知るためにライブラリやRubyやソケットプログラミングに精通していません。私はこのライブラリがちょうどこのようなものをサポートしていないとは想像できませんが、私は推測することができます。
どのように私はSO_REUSEADDRは、データグラムソケットで動作するように入手できますか?
require 'eventmachine'
class PassThruServer < EM::Connection
def initialize
set_sock_opt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
end
def post_init()
# too late?
# set_sock_opt Socket::SOL_SOCKET, Socket::SO_REUSEADDR, true
end
def receive_data(data)
puts "PT: "+ data.to_s()
send_datagram data, "localhost", 6060
end
end
class MessagePrinter < EM::Connection
def receive_data(data)
puts "MP: "+ data.to_s()
end
end
EM.run do
# pass through
EM.open_datagram_socket "localhost", 5050, PassThruServer
# EM.open_datagram_socket "localhost", 5050, PassThruServer
# test consumer
EM.open_datagram_socket "localhost", 6060, MessagePrinter
# test producer
EM.open_datagram_socket "localhost", nil do |conn|
i = 1
EM.add_periodic_timer(3) do
data = "message: "+ i.to_s() +"\n"
conn.send_datagram data, "localhost", 5050
i += 1
end
end
end
TCPは常にSO_REUSEADDRを使用するようです。私は、UDPがソケットオプションをどこで初期化するのかわかりません。私が理解している限り、ソケットが実際に開かれる前にそれらを設定する必要がありますか?
私は本当に私はしかし、正しい場所に探していますことを確認するために、RubyのCバインディングを完全に理解していません。