Class DRb::DRbTCPSocket
In: drb/drb.rb
Parent: Object

The default drb protocol.

Communicates over a TCP socket.

Methods

Attributes

uri  [R]  Get the URI that we are connected to.

Public Class methods

[Source]

# File drb/drb.rb, line 827
    def self.getservername
      host = Socket::gethostname
      begin
        Socket::gethostbyname(host)[0]
      rescue
        host
      end
    end

Create a new DRbTCPSocket instance.

uri is the URI we are connected to. soc is the tcp socket we are bound to. config is our configuration.

[Source]

# File drb/drb.rb, line 880
    def initialize(uri, soc, config={})
      @uri = uri
      @socket = soc
      @config = config
      @acl = config[:tcp_acl]
      @msg = DRbMessage.new(config)
      set_sockopt(@socket)
    end

Open a client connection to uri using configuration config.

[Source]

# File drb/drb.rb, line 819
    def self.open(uri, config)
      host, port, option = parse_uri(uri)
      host.untaint
      port.untaint
      soc = TCPSocket.open(host, port)
      self.new(uri, soc, config)
    end

Open a server listening for connections at uri using configuration config.

[Source]

# File drb/drb.rb, line 855
    def self.open_server(uri, config)
      uri = 'druby://:0' unless uri
      host, port, opt = parse_uri(uri)
      if host.size == 0
        host = getservername
        soc = open_server_inaddr_any(host, port)
      else
        soc = TCPServer.open(host, port)
      end
      port = soc.addr[1] if port == 0
      uri = "druby://#{host}:#{port}"
      self.new(uri, soc, config)
    end

[Source]

# File drb/drb.rb, line 836
    def self.open_server_inaddr_any(host, port)
      infos = Socket::getaddrinfo(host, nil, 
                                  Socket::AF_UNSPEC,
                                  Socket::SOCK_STREAM, 
                                  0,
                                  Socket::AI_PASSIVE)
      family = infos.collect { |af, *_| af }.uniq
      case family
      when ['AF_INET']
        return TCPServer.open('0.0.0.0', port)
      when ['AF_INET6']
        return TCPServer.open('::', port)
      else
        return TCPServer.open(port)
      end
    end

Parse uri into a [uri, option] pair.

[Source]

# File drb/drb.rb, line 870
    def self.uri_option(uri, config)
      host, port, option = parse_uri(uri)
      return "druby://#{host}:#{port}", option
    end

Public Instance methods

On the server side, for an instance returned by open_server, accept a client connection and return a new instance to handle the server’s side of this client-server session.

[Source]

# File drb/drb.rb, line 939
    def accept
      while true
        s = @socket.accept
        break if (@acl ? @acl.allow_socket?(s) : true) 
        s.close
      end
      self.class.new(nil, s, @config)
    end

Check to see if this connection is alive.

[Source]

# File drb/drb.rb, line 949
    def alive?
      return false unless @socket
      if IO.select([@socket], nil, nil, 0)
        close
        return false
      end
      true
    end

Close the connection.

If this is an instance returned by open_server, then this stops listening for new connections altogether. If this is an instance returned by open or by accept, then it closes this particular client-server session.

[Source]

# File drb/drb.rb, line 929
    def close
      if @socket
        @socket.close
        @socket = nil
      end
    end

Get the address of our TCP peer (the other end of the socket we are bound to.

[Source]

# File drb/drb.rb, line 894
    def peeraddr
      @socket.peeraddr
    end

On the client side, receive a reply from the server.

[Source]

# File drb/drb.rb, line 917
    def recv_reply
      @msg.recv_reply(stream)
    end

On the server side, receive a request from the client.

[Source]

# File drb/drb.rb, line 907
    def recv_request
      @msg.recv_request(stream)
    end

On the server side, send a reply to the client.

[Source]

# File drb/drb.rb, line 912
    def send_reply(succ, result)
      @msg.send_reply(stream, succ, result)
    end

On the client side, send a request to the server.

[Source]

# File drb/drb.rb, line 902
    def send_request(ref, msg_id, arg, b)
      @msg.send_request(stream, ref, msg_id, arg, b)
    end

Get the socket.

[Source]

# File drb/drb.rb, line 899
    def stream; @socket; end

[Validate]