Event Machine - callbacks from different connections

T

Tim Conner

In the RDoc for EventMachine, the following statement is made:
"You can also call send_data to write to a connection other than the one
whose callback you are calling send_data from. This is done by recording
the value of the connection in any callback function (the value self),
in any variable visible to other callback invocations on the same or
different connection objects. (Need an example to make that clear.)"

If I have the following code, how can I make it so that the 'send_data'
method for ServerOne is called when data is received for ServerTwo?
i.e. I want a packet of data to be sent out on port 1700 when a packet
is received on port 1800 (but i need the listener on port 1700 to stay
listening)

require 'rubygems'
require 'eventmachine'

module ServerOne
def receive_data data
sender_info = get_peername[2,6].unpack "nC4"
port = sender_info[0]
ip = sender_info[1..4].join(".").to_s
puts "IP = #{ip}"
puts "Port = #{port}"
end
end

module ServerTwo
def receive_data data
sender_info = get_peername[2,6].unpack "nC4"
port = sender_info[0]
ip = sender_info[1..4].join(".").to_s
puts "IP = #{ip}"
puts "Port = #{port}"
end
end

EventMachine::run {
EventMachine::eek:pen_datagram_socket "192.168.0.2", 1700, ServerOne
EventMachine::eek:pen_datagram_socket "192.168.0.2", 1800, ServerTwo
}


Many thanks
 
J

Jason Roelofs

The idea is that there's a collection of the connection objects held
outside of the servers and used where necessary. In your case,
something like this would work:

$one_conns = []
$two_conns = []

module ServerOne
def receive_data data
sender_info = get_peername[2,6].unpack "nC4"
port = sender_info[0]
ip = sender_info[1..4].join(".").to_s
puts "IP = #{ip}"
puts "Port = #{port}"

# find your $two_conn and
$two_conns.send_data ...
end
end

module ServerTwo
def receive_data data
sender_info = get_peername[2,6].unpack "nC4"
port = sender_info[0]
ip = sender_info[1..4].join(".").to_s
puts "IP = #{ip}"
puts "Port = #{port}"

#Find your one conn and
$one_conns.send_data ...
end
end

EventMachine::run {
EventMachine::eek:pen_datagram_socket "192.168.0.2", 1700, ServerOne do |conn|
$one_conns << conn
end

EventMachine::eek:pen_datagram_socket "192.168.0.2", 1800, ServerTwo do |conn|
$two_conns << conn
end
}


Jason
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,755
Messages
2,569,537
Members
45,022
Latest member
MaybelleMa

Latest Threads

Top