EventMachine dynamic port forwarding


#1

I need a dynamic port forwarding application, i listem packets from a ip
on port 10000, then i need not just send the data i receive to other
ports, but i need first create a connection on this new port first and
listen to any connection on this port, if i get any thing on this port i
send back through the first connection.

Its easy to create a single server with EventMachine like the code
below:

require ‘rubygems’
require ‘eventmachine’

module Echo
def receive_data data
send_data data
end
end

EM.run {
EM.start_server “0.0.0.0”, 10000, Echo
}

But how could i create another server inside the current server?


#2

Yea, i said wrong, its start a new connection, not a new server.

The example you write, run without error, but dont create the new
connection, but i got the idea, the problem with eventmachine is the
documentation =/


#3

Diego B. wrote:

require ‘eventmachine’

But how could i create another server inside the current server?

Well, you can start as many servers as you would like, but it sounds
more like you need to open a connection to a server, not start another.
You can use EventMachine::connect for that.

I believe you can do something like (completely untested):

require ‘rubygems’
require ‘eventmachine’

module Other
attr_accessor :sender

def receive_data data
self.sender.send_data data
end
end

module Echo
def post_init
@other_side = EM.connect “0.0.0.0”, 10001, Other
@other_side.sender = self
end

def receive_data data
@other_side.send_data data
end
end

EM.run {
EM.start_server “0.0.0.0”, 10000, Echo
}

-Justin


#4

Diego B. wrote:

Diego B. wrote:

Yea, i said wrong, its start a new connection, not a new server.

The example you write, run without error, but dont create the new
connection, but i got the idea, the problem with eventmachine is the
documentation =/

Now im with a question, when i use EventMachine::connect, i connect to a
tcp port, my problem is, i need create a tcp port to others process
connect, so i think its the start server, no?

Someone?


#5

Diego B. wrote:

Yea, i said wrong, its start a new connection, not a new server.

The example you write, run without error, but dont create the new
connection, but i got the idea, the problem with eventmachine is the
documentation =/

Now im with a question, when i use EventMachine::connect, i connect to a
tcp port, my problem is, i need create a tcp port to others process
connect, so i think its the start server, no?


#6

Diego B. wrote:

I need a dynamic port forwarding application, i listem packets from a ip
on port 10000, then i need not just send the data i receive to other
ports, but i need first create a connection on this new port first and
listen to any connection on this port, if i get any thing on this port i
send back through the first connection.

http://github.com/igrigorik/em-proxy/tree/master/
also rtunnel.
GL.
-=r


#7

From: “Diego B.” removed_email_address@domain.invalid

Now im with a question, when i use EventMachine::connect, i connect to a
tcp port, my problem is, i need create a tcp port to others process
connect, so i think its the start server, no?

Someone?

http://lmgtfy.com/?q=eventmachine+start_server

:wink:

http://rubyeventmachine.com/wiki/CodeSnippets
http://20bits.com/articles/an-eventmachine-tutorial/
http://rubyeventmachine.com/wiki/FAQ
http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/

Regards,

Bill


#8

I got what i need :slight_smile:

the code is below:

require ‘rubygems’
require ‘eventmachine’

class VirtualPort < EventMachine::Connection
attr_accessor :sender

def initialize *args
super

 @sender = args.first
 @sender.create_client(self)

end

def receive_data data
send_data "Você digitou: " + data
puts "Cliente: " + data
@sender.send_data(data)
end
end

class Server < EventMachine::Connection
attr_accessor :client

def initialize *args
super
end

def create_client(client)
@client = client
end

def post_init
puts “Acabei de me conectar”
EM.start_server “0.0.0.0”, 20000, VirtualPort, self
end

def receive_data data
send_data "Você digitou: " + data
puts "Server: " + data
if(@client)
@client.send_data(data)
end
end
end

EM.run {
EM.start_server “0.0.0.0”, 10000, Server
}