class NetRat

Attributes

ip[R]
port[R]
socket[R]

Public Class Methods

new(port, ip = nil) click to toggle source
# File lib/netrat.rb, line 8
def initialize(port, ip = nil)
    @ip = ip
    @port = port
    @socket = nil
end

Public Instance Methods

connect(options = {})
Alias for: listen
listen(options = {}) click to toggle source
# File lib/netrat.rb, line 14
def listen(options = {})
    options[:keepalive] ||= false

    trap("SIGINT") do
        puts
        return
    end

    if (@ip.nil?)
        server = TCPServer.new(@port)
        server.listen(1)
        @socket = server.accept
    else
        @socket = TCPSocket.open(@ip, @port)
    end

    loop do
        if (IO.select([], [], [@socket, STDIN], 0))
            server.close if (server)
            @socket.close if (@socket)
            return
        end

        begin
            while(!(data = @socket.recv_nonblock(100)).empty?)
                STDOUT.write(data);
            end
            break if (!options[:keepalive])
        rescue Errno::ECONNRESET
            break if (!options[:keepalive])
        rescue Errno::EAGAIN
        end

        begin
            while (!(data = STDIN.read_nonblock(100)).empty?)
                @socket.write(data);
            end
            break if (!options[:keepalive])
        rescue Errno::EAGAIN
        rescue EOFError
            break if (!options[:keepalive])
        end

        IO.select(
            [@socket, STDIN],
            [@socket, STDIN],
            [@socket, STDIN]
        )
    end
ensure
    server.close if (server)
    @socket.close if (@socket)
end
Also aliased as: connect