| Class | DRb::DRbTCPSocket |
| In: |
drb/drb.rb
|
| Parent: | Object |
The default drb protocol.
Communicates over a TCP socket.
| uri | [R] | Get the URI that we are connected to. |
# 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 885 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 858 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) 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.
# File drb/drb.rb, line 875 def self.uri_option(uri, config) host, port, option = parse_uri(uri) return "druby://#{host}:#{port}", option 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 944 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 959 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 934 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 899 def peeraddr @socket.peeraddr end
On the client side, receive a reply from the server.
# File drb/drb.rb, line 922 def recv_reply @msg.recv_reply(stream) end
On the server side, receive a request from the client.
# File drb/drb.rb, line 912 def recv_request @msg.recv_request(stream) end
On the server side, send a reply to the client.
# File drb/drb.rb, line 917 def send_reply(succ, result) @msg.send_reply(stream, succ, result) end
ruby-doc.org is a community service provided by James Britt and Happy Camper Studios, a Phoenix, Arizona, Ruby application development company.
Documentation content on ruby-doc.org is provided by remarkable members of the Ruby community.
For more information on the Ruby programming language, visit ruby-lang.org.
Want to help improve Ruby's API docs? See Ruby Documentation Guidelines.