#!/usr/bin/env ruby require 'socket' require 'webrick' $pending_hosts = {} $hosts = {} $server = WEBrick::GenericServer.new(:Port => 7777) trap('SIGINT') do $server.shutdown end $server.start do |socket| peer_address = socket.peeraddr ip = peer_address[3] if ip == '::1' || ip == '192.168.1.2' then ip = 'onesadcookie.com' end $hosts.keys.each do |ip| socket.puts(ip) end $pending_hosts[ip] = true Thread.new do 0.upto(3) do |i| begin puts "Attempting to connect back to #{ip}..." connect_back_socket = TCPSocket.new(ip, 7778) puts "Made socket..." connect_back_socket.puts('ping') connect_back_socket.flush() puts "Sent ping..." text = connect_back_socket.read raise "Invalid response: #{text}" unless text =~ /pong/ $pending_hosts[ip] = nil $hosts[ip] = true puts "Registered #{ip}" break rescue => error puts "Failed to connect back to #{ip} because #{error}" if i < 3 then puts 'Retrying in 5 seconds...' sleep 5 else $pending_hosts[ip] = nil puts 'Giving up' end end end end end