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, 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
.
# File drb/drb.rb, line 853 def self.open_server(uri, config) uri = 'druby://:0' unless uri host, port, opt = 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