Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TCP Socket Network Programming In Ruby

qhwa
November 17, 2015

TCP Socket Network Programming In Ruby

A brief introduction to TCP Socket related network programming in Ruby language.

qhwa

November 17, 2015
Tweet

More Decks by qhwa

Other Decks in Technology

Transcript

  1. * classical style * Interactive * Multiplexing * Event based

    * Make a Socks5 Proxy * Stateful Socks5 Proxy
  2. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port
  3. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0
  4. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0
  5. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept
  6. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now
  7. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close
  8. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close
  9. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end
  10. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end
  11. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end end
  12. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end end
  13. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end end Server.new.start(port: 23333, bind: '127.0.0.1')
  14. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) sock

    = Socket.new(:INET, :STREAM) sock.bind Addrinfo.tcp bind, port sock.listen 0 client, client_addr = sock.accept client.puts "Hello there! %s" % Time.now client.close sock.close end end Server.new.start(port: 23333, bind: '127.0.0.1')
  15. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now
  16. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close
  17. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end
  18. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end
  19. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end
  20. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end end
  21. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end end
  22. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end end Server.new.start(port: 23333, bind: '127.0.0.1')
  23. require 'socket' class Server def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind,

    port) do |sock, remote| sock.puts "Hello there! %s" % Time.now sock.close end end end Server.new.start(port: 23333, bind: '127.0.0.1')
  24. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] }
  25. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] }
  26. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!"
  27. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!"
  28. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do
  29. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp
  30. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q"
  31. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close
  32. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close break
  33. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close break end
  34. ... def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock,

    client_addr| log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close break end sock.puts input.reverse
  35. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close else sock.puts input.reverse end end end end
  36. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close else sock.puts input.reverse end end end end Thread.new do end
  37. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == "q" sock.close else sock.puts input.reverse end end end end Thread.new do end
  38. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == 'q' sock.close break else sock.puts input.reverse end end end end
  39. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == 'q' sock.close break else sock.puts input.reverse end end end end if fork else sock.close end
  40. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == 'q' sock.close break else sock.puts input.reverse end end end end if fork else sock.close end
  41. def start(bind: '0.0.0.0', port: nil) Socket.tcp_server_loop(bind, port) do |sock, client_addr|

    log { "client connected: %s:%d" % [client_addr.ip_address, client_addr.ip_port] } sock.puts "Welcome buddy!" loop do input = sock.gets.chomp if input == 'q' sock.close break else sock.puts input.reverse end end end end if fork else sock.close end
  42. module Handler def receive_data data data.chomp! if data == "q"

    close_connection else send_data data.reverse
  43. module Handler def receive_data data data.chomp! if data == "q"

    close_connection else send_data data.reverse send_data "\n"
  44. module StatefulHandler include Socks5Handler def connect ip, _ = client_addr

    # to allow: redis-cli set allowed:127.0.0.1 1 # to disallow: redis-cli del allowed:127.0.0.1 EM.defer -> { Redis.new.get "allowed:#{ip}" }, -> (allowed) { allowed ? super : close_connection } end end
  45. block IO start end non-block IO start end check check

    check check check signal driven IO notify end async IO start notify XBJUGPS EBUB DPQZEBUB GSPN LFSOFMUP VTFSTQBDF