The default drb protocol.

Communicates over a TCP socket.

Methods
A
C
G
N
O
P
R
S
U
Attributes
[R] uri

Get the URI that we are connected to.

Class Public methods
getservername()
# File ../ruby/lib/drb/drb.rb, line 830
def self.getservername
  host = Socket::gethostname
  begin
    Socket::gethostbyname(host)[0]
  rescue
    'localhost'
  end
end
new(uri, soc, config={})

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.

# File ../ruby/lib/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(uri, config)

Open a client connection to uri using configuration config.

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

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

# File ../ruby/lib/drb/drb.rb, line 853
def self.open_server(uri, config)
  uri = 'druby://:0' unless uri
  host, port, _ = parse_uri(uri)
  config = {:tcp_original_host => host}.update(config)
  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
  config[:tcp_port] = port
  uri = "druby://#{host}:#{port}"
  self.new(uri, soc, config)
end
open_server_inaddr_any(host, port)
# File ../ruby/lib/drb/drb.rb, line 839
def self.open_server_inaddr_any(host, port)
  infos = Socket::getaddrinfo(host, nil,
                              Socket::AF_UNSPEC,
                              Socket::SOCK_STREAM,
                              0,
                              Socket::AI_PASSIVE)
  families = Hash[*infos.collect { |af, *_| af }.uniq.zip([]).flatten]
  return TCPServer.open('0.0.0.0', port) if families.has_key?('AF_INET')
  return TCPServer.open('::', port) if families.has_key?('AF_INET6')
  return TCPServer.open(port)
end
uri_option(uri, config)

Parse uri into a [uri, option] pair.

# File ../ruby/lib/drb/drb.rb, line 870
def self.uri_option(uri, config)
  host, port, option = parse_uri(uri)
  return "druby://#{host}:#{port}", option
end
Class Private methods
parse_uri(uri)
# File ../ruby/lib/drb/drb.rb, line 807
def self.parse_uri(uri)
  if uri =~ /^druby:\/\/(.*?):(\d+)(\?(.*))?$/
    host = $1
    port = $2.to_i
    option = $4
    [host, port, option]
  else
    raise(DRbBadScheme, uri) unless uri =~ /^druby:/
    raise(DRbBadURI, 'can\t parse uri:' + uri)
  end
end
Instance Public methods
accept()

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.

# File ../ruby/lib/drb/drb.rb, line 939
def accept
  while true
    s = @socket.accept
    break if (@acl ? @acl.allow_socket?(s) : true)
    s.close
  end
  if @config[:tcp_original_host].to_s.size == 0
    uri = "druby://#{s.addr[3]}:#{@config[:tcp_port]}"
  else
    uri = @uri
  end
  self.class.new(uri, s, @config)
end
alive?()

Check to see if this connection is alive.

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

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.

# File ../ruby/lib/drb/drb.rb, line 929
def close
  if @socket
    @socket.close
    @socket = nil
  end
end
peeraddr()

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

# File ../ruby/lib/drb/drb.rb, line 894
def peeraddr
  @socket.peeraddr
end
recv_reply()

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

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

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

# File ../ruby/lib/drb/drb.rb, line 907
def recv_request
  @msg.recv_request(stream)
end
send_reply(succ, result)

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

# File ../ruby/lib/drb/drb.rb, line 912
def send_reply(succ, result)
  @msg.send_reply(stream, succ, result)
end
send_request(ref, msg_id, arg, b)

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

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

Get the socket.

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