Extended maintenance of Ruby 1.9.3 ended on February 23, 2015. Read more
The default drb protocol.
Communicates over a TCP socket.
# File drb/drb.rb, line 830
def self.getservername
host = Socket::gethostname
begin
Socket::gethostbyname(host)[0]
rescue
'localhost'
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.
# 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.
# 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 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
# 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
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
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 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
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
On the client side, receive a reply from the server.
# File drb/drb.rb, line 917
def recv_reply
@msg.recv_reply(stream)
end
On the server side, receive a request from the client.
# File drb/drb.rb, line 907
def recv_request
@msg.recv_request(stream)
end
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
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.