class EventMachine::Synchrony::TCPSocket

def new(*args)

def new(*args)
  if args.size == 1
    _old_new(*args)
  else
    # In TCPSocket, new against an unknown hostname raises SocketError with
    # a message "getaddrinfo: nodename nor servname provided, or not known".
    # In EM, connect against an unknown hostname raises EM::ConnectionError
    # with a message of "unable to resolve server address" 
    begin
      socket = EventMachine::connect(*args[0..1], self)
    rescue EventMachine::ConnectionError => e
      raise SocketError, e.message
    end
    # In TCPSocket, new against a closed port raises Errno::ECONNREFUSED.
    # In EM, connect against a closed port result in a call to unbind with
    # a reason param of Errno::ECONNREFUSED as a class, not an instance.
    unless socket.sync(:in)  # wait for connection
      raise socket.unbind_reason.new if socket.unbind_reason.is_a? Class
      raise SocketError
    end
    socket
  end
end