Forum: Ruby EventMachine dynamic port forwarding

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Diego B. (Guest)
on 2009-05-16 02:42
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?
Justin C. (Guest)
on 2009-05-16 03:08
(Received via mailing list)
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
Diego B. (Guest)
on 2009-05-18 00:48
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 =/
Diego B. (Guest)
on 2009-05-18 01:14
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?
Diego B. (Guest)
on 2009-05-19 16:49
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?
Bill K. (Guest)
on 2009-05-19 17:52
(Received via mailing list)
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

;)

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...


Regards,

Bill
Roger P. (Guest)
on 2009-05-19 23:21
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
Diego B. (Guest)
on 2009-05-21 05:38
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
}
This topic is locked and can not be replied to.