# EventMachine dynamic port forwarding

**URL:** <https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109>\
**Category:** Ruby\
**Created:** [May 16, 2009, 12:42am UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109 "2009-05-16T00:42:16Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 16, 2009, 12:42am UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/1 "2009-05-16T00:42:16Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 17, 2009, 10:48pm UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/2 "2009-05-17T22:48:05Z")

</div>

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 =/

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 16, 2009, 1:08am UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/3 "2009-05-16T01:08:16Z")

</div>

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

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 19, 2009, 2:49pm UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/4 "2009-05-19T14:49:01Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 17, 2009, 11:14pm UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/5 "2009-05-17T23:14:39Z")

</div>

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?

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 19, 2009, 9:21pm UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/6 "2009-05-19T21:21:58Z")

</div>

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.

> **[GitHub - igrigorik/em-proxy: EventMachine Proxy DSL for writing high-performance...](https://github.com/igrigorik/em-proxy/tree/master/)**
>
> master/

also rtunnel.  
GL.  
-=r

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 19, 2009, 3:52pm UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/7 "2009-05-19T15:52:58Z")

</div>

From: “Diego B.” [removed\_email\_address@domain.invalid](mailto: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?

> **[LMGTFY - Let Me Google That For You](https://lmgtfy.app/?q=eventmachine%2Bstart_server)**
>
> For all those people who find it more convenient to bother you with their question rather than to Google it for themselves.

😉

[http://rubyeventmachine.com/wiki/CodeSnippets](http://rubyeventmachine.com/wiki/CodeSnippets)

> **[An EventMachine Tutorial](http://20bits.com/article/an-eventmachine-tutorial)**
>
> Ruby / EventMachine is an event-driven networking library for Ruby, similar to Twisted for Python. Certain aspects of it are also similar to Erlang/OTP's gen\_server module.

[http://rubyeventmachine.com/wiki/FAQ](http://rubyeventmachine.com/wiki/FAQ)  
[http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/](http://www.igvita.com/2008/05/27/ruby-eventmachine-the-speed-demon/)

Regards,

Bill

---

<div class="post-metadata">

**Author:** ![di3go](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/d/a9a28c/32.png) [@di3go](https://www.ruby-forum.com/u/di3go)\
**Post date:** [May 21, 2009, 3:38am UTC](https://www.ruby-forum.com/t/eventmachine-dynamic-port-forwarding/168109/8 "2009-05-21T03:38:31Z")

</div>

I got what i need 🙂

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  
}
