Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more

In Files

  • drb/drb.rb

DRb::DRbTCPSocket

The default drb protocol.

Communicates over a TCP socket.

Attributes

uri[R]

Get the URI that we are connected to.

Public Class Methods

getservername() click to toggle source
 
               # File drb/drb.rb, line 830
def self.getservername
  host = Socket::gethostname
  begin
    Socket::gethostbyname(host)[0]
  rescue
    'localhost'
  end
end
            
new(uri, soc, config={}) click to toggle source

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 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) click to toggle source

Open a client connection to uri using configuration config.

 
               # File 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) click to toggle source

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

 
               # File 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) click to toggle source
 
               # File 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) click to toggle source

Parse uri into a [uri, option] pair.

 
               # 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

accept() click to toggle source

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 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?() click to toggle source

Check to see if this connection is alive.

 
               # File 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() click to toggle source

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 drb/drb.rb, line 929
def close
  if @socket
    @socket.close
    @socket = nil
  end
end
            
peeraddr() click to toggle source

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

 
               # File drb/drb.rb, line 894
def peeraddr
  @socket.peeraddr
end
            
recv_reply() click to toggle source

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

 
               # File drb/drb.rb, line 917
def recv_reply
  @msg.recv_reply(stream)
end
            
recv_request() click to toggle source

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

 
               # File drb/drb.rb, line 907
def recv_request
  @msg.recv_request(stream)
end
            
send_reply(succ, result) click to toggle source

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

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

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

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

Get the socket.

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

Commenting is here to help enhance the documentation. For example, code samples, or clarification of the documentation.

If you have questions about Ruby or the documentation, please post to one of the Ruby mailing lists. You will get better, faster, help that way.

If you wish to post a correction of the docs, please do so, but also file bug report so that it can be corrected for the next release. Thank you.

If you want to help improve the Ruby documentation, please visit Documenting-ruby.org.