Class: EventMachine::Protocols::Socks4
Relationships & Source Files | |
Super Chains via Extension / Inclusion / Inheritance | |
Class Chain:
self,
Connection
|
|
Instance Chain:
self,
Connection
|
|
Inherits: |
EventMachine::Connection
|
Defined in: | lib/em/protocols/socks4.rb |
Overview
Basic SOCKS v4 client implementation
Use as you would any regular connection:
class MyConn < EM::P::Socks4 def post_init send_data("sup") end
def receive_data(data)
send_data("you said: #data
")
end
end
EM.connect socks_host, socks_port, MyConn, host, port
Class Method Summary
- .new(host, port) ⇒ Socks4 constructor
Connection
- Inherited
.new | Override .new so subclasses don't have to call super and can ignore connection-specific arguments. |
Instance Attribute Summary
Connection
- Inherited
#comm_inactivity_timeout | comm_inactivity_timeout returns the current value (float in seconds) of the inactivity-timeout property of network-connection and datagram-socket objects. |
#comm_inactivity_timeout= | Allows you to set the inactivity-timeout property for a network connection or datagram socket. |
#error? | Returns true if the connection is in an error state, false otherwise. |
#notify_readable= | Watches connection for readability. |
#notify_readable?, | |
#notify_writable= | Watches connection for writeability. |
#notify_writable? | Returns true if the connection is being watched for writability. |
#paused?, | |
#pending_connect_timeout | The duration after which a TCP connection in the connecting state will fail. |
#pending_connect_timeout= | Sets the duration after which a TCP connection in a connecting state will fail. |
#signature, #watch_only? |
Instance Method Summary
Connection
- Inherited
#associate_callback_target | conn_associate_callback_target. |
#close_connection | EventMachine::Connection#close_connection is called only by user code, and never by the event loop. |
#close_connection_after_writing | A variant of EventMachine#close_connection. |
#connection_completed | Called by the event loop when a remote TCP connection attempt completes successfully. |
#detach | Removes given connection from the event loop. |
#disable_keepalive | t_disable_keepalive. |
#enable_keepalive | t_enable_keepalive. |
#get_cipher_bits, #get_cipher_name, #get_cipher_protocol, | |
#get_idle_time | The number of seconds since the last send/receive activity on this connection. |
#get_outbound_data_size | conn_get_outbound_data_size. |
#get_peer_cert | If TLS is active on the connection, returns the remote X509 certificate as a string, in the popular PEM format. |
#get_peername | This method is used with stream-connections to obtain the identity of the remotely-connected peer. |
#get_pid | Returns the PID (kernel process identifier) of a subprocess associated with this |
#get_proxied_bytes | The number of bytes proxied to another connection. |
#get_sni_hostname, #get_sock_opt, | |
#get_sockname | Used with stream-connections to obtain the identity of the local side of the connection. |
#get_status | Returns a subprocess exit status. |
#initialize | Stubbed initialize so legacy superclasses can safely call super. |
#original_method, | |
#pause | Pause a connection so that EventMachine#send_data and |
#post_init | Called by the event loop immediately after the network connection has been established, and before resumption of the network loop. |
#proxy_completed | called when the reactor finished proxying all of the requested bytes. |
#proxy_incoming_to | EventMachine::Connection#proxy_incoming_to is called only by user code. |
#proxy_target_unbound | Called by the reactor after attempting to relay incoming data to a descriptor (set as a proxy target descriptor with EventMachine.enable_proxy) that has already been closed. |
#receive_data | Called by the event loop whenever data has been received by the network connection. |
#reconnect | Reconnect to a given host/port with the current instance. |
#resume | Resume a connection's EventMachine#send_data and |
#send_data | Call this method to send data to the remote end of the network connection. |
#send_datagram | Sends UDP messages. |
#send_file_data | Like Connection#send_data, this sends data to the remote end of the network connection. |
#set_sock_opt, | |
#ssl_handshake_completed | Called by |
#ssl_verify_peer | Called by |
#start_tls | Call EventMachine#start_tls at any point to initiate TLS encryption on connected streams. |
#stop_proxying | A helper method for EventMachine.disable_proxy |
#stream_file_data | Open a file on the filesystem and send it to the remote peer. |
#unbind | called by the framework whenever a connection (either a server or client connection) is closed. |
Constructor Details
.new(host, port) ⇒ Socks4
# File 'lib/em/protocols/socks4.rb', line 20
def initialize(host, port) @host = Socket.gethostbyname(host).last @port = port @socks_error_code = nil @buffer = '' setup_methods end
Instance Method Details
#restore_methods
[ GitHub ]# File 'lib/em/protocols/socks4.rb', line 35
def restore_methods class << self remove_method :post_init remove_method :receive_data end end
#setup_methods
[ GitHub ]# File 'lib/em/protocols/socks4.rb', line 28
def setup_methods class << self def post_init; socks_post_init; end def receive_data(*a); socks_receive_data(*a); end end end
#socks_post_init
[ GitHub ]# File 'lib/em/protocols/socks4.rb', line 42
def socks_post_init header = [4, 1, @port, @host, 0].flatten.pack("CCnA4C") send_data(header) end
#socks_receive_data(data)
[ GitHub ]# File 'lib/em/protocols/socks4.rb', line 47
def socks_receive_data(data) @buffer << data return if @buffer.size < 8 header_resp = @buffer.slice! 0, 8 _, r = header_resp.unpack("cc") if r != 90 @socks_error_code = r close_connection return end restore_methods post_init receive_data(@buffer) unless @buffer.empty? end