Class: DRb::DRbTCPSocket
- Inherits:
-
Object
- Object
- DRb::DRbTCPSocket
- Defined in:
- lib/drb/drb.rb
Overview
The default drb protocol which communicates over a TCP socket.
The DRb TCP protocol URI looks like: druby://<host>:<port>?<option>
. The option is optional.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#uri ⇒ Object
readonly
Get the URI that we are connected to.
Class Method Summary collapse
-
.getservername ⇒ Object
Returns the hostname of this server.
-
.open(uri, config) ⇒ Object
Open a client connection to
uri
(DRb URI string) using configurationconfig
. -
.open_server(uri, config) ⇒ Object
Open a server listening for connections at
uri
using configurationconfig
. -
.open_server_inaddr_any(host, port) ⇒ Object
For the families available for
host
, returns a TCPServer onport
. -
.uri_option(uri, config) ⇒ Object
Parse
uri
into a [uri, option] pair.
Instance Method Summary collapse
-
#accept ⇒ Object
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.
-
#alive? ⇒ Boolean
Check to see if this connection is alive.
-
#close ⇒ Object
Close the connection.
-
#initialize(uri, soc, config = {}) ⇒ DRbTCPSocket
constructor
Create a new DRbTCPSocket instance.
-
#peeraddr ⇒ Object
Get the address of our TCP peer (the other end of the socket we are bound to..
-
#recv_reply ⇒ Object
On the client side, receive a reply from the server.
-
#recv_request ⇒ Object
On the server side, receive a request from the client.
-
#send_reply(succ, result) ⇒ Object
On the server side, send a reply to the client.
-
#send_request(ref, msg_id, arg, b) ⇒ Object
On the client side, send a request to the server.
-
#set_sockopt(soc) ⇒ Object
:nodoc:.
-
#shutdown ⇒ Object
Graceful shutdown.
-
#stream ⇒ Object
Get the socket.
Constructor Details
#initialize(uri, soc, config = {}) ⇒ DRbTCPSocket
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.
903 904 905 906 907 908 909 910 911 |
# File 'lib/drb/drb.rb', line 903 def initialize(uri, soc, config={}) @uri = uri @socket = soc @config = config @acl = config[:tcp_acl] @msg = DRbMessage.new(config) set_sockopt(@socket) @shutdown_pipe_r, @shutdown_pipe_w = IO.pipe end |
Instance Attribute Details
#uri ⇒ Object (readonly)
Get the URI that we are connected to.
914 915 916 |
# File 'lib/drb/drb.rb', line 914 def uri @uri end |
Class Method Details
.getservername ⇒ Object
Returns the hostname of this server
845 846 847 848 849 850 851 852 853 854 855 856 |
# File 'lib/drb/drb.rb', line 845 def self.getservername host = Socket::gethostname begin Socket::getaddrinfo(host, nil, Socket::AF_UNSPEC, Socket::SOCK_STREAM, 0, Socket::AI_PASSIVE)[0][3] rescue 'localhost' end end |
.open(uri, config) ⇒ Object
Open a client connection to uri
(DRb URI string) using configuration config
.
This can raise DRb::DRbBadScheme or DRb::DRbBadURI if uri
is not for a recognized protocol. See DRb::DRbServer.new for information on built-in URI protocols.
838 839 840 841 842 |
# File 'lib/drb/drb.rb', line 838 def self.open(uri, config) host, port, = parse_uri(uri) soc = TCPSocket.open(host, port) self.new(uri, soc, config) end |
.open_server(uri, config) ⇒ Object
Open a server listening for connections at uri
using configuration config
.
876 877 878 879 880 881 882 883 884 885 886 887 888 889 890 |
# File 'lib/drb/drb.rb', line 876 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) ⇒ Object
For the families available for host
, returns a TCPServer on port
. If port
is 0 the first available port is used. IPv4 servers are preferred over IPv6 servers.
861 862 863 864 865 866 867 868 869 870 871 872 |
# File 'lib/drb/drb.rb', line 861 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) # :stopdoc: end |
.uri_option(uri, config) ⇒ Object
Parse uri
into a [uri, option] pair.
893 894 895 896 |
# File 'lib/drb/drb.rb', line 893 def self.uri_option(uri, config) host, port, option = parse_uri(uri) return "druby://#{host}:#{port}", option end |
Instance Method Details
#accept ⇒ Object
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.
971 972 973 974 975 976 977 978 979 980 981 982 983 984 |
# File 'lib/drb/drb.rb', line 971 def accept while true s = accept_or_shutdown return nil unless s 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? ⇒ Boolean
Check to see if this connection is alive.
1001 1002 1003 1004 1005 1006 1007 1008 |
# File 'lib/drb/drb.rb', line 1001 def alive? return false unless @socket if @socket.to_io.wait_readable(0) close return false end true end |
#close ⇒ Object
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.
953 954 955 956 957 958 959 960 |
# File 'lib/drb/drb.rb', line 953 def close shutdown if @socket @socket.close @socket = nil end close_shutdown_pipe end |
#peeraddr ⇒ Object
Get the address of our TCP peer (the other end of the socket we are bound to.
918 919 920 |
# File 'lib/drb/drb.rb', line 918 def peeraddr @socket.peeraddr end |
#recv_reply ⇒ Object
On the client side, receive a reply from the server.
941 942 943 |
# File 'lib/drb/drb.rb', line 941 def recv_reply @msg.recv_reply(stream) end |
#recv_request ⇒ Object
On the server side, receive a request from the client.
931 932 933 |
# File 'lib/drb/drb.rb', line 931 def recv_request @msg.recv_request(stream) end |
#send_reply(succ, result) ⇒ Object
On the server side, send a reply to the client.
936 937 938 |
# File 'lib/drb/drb.rb', line 936 def send_reply(succ, result) @msg.send_reply(stream, succ, result) end |
#send_request(ref, msg_id, arg, b) ⇒ Object
On the client side, send a request to the server.
926 927 928 |
# File 'lib/drb/drb.rb', line 926 def send_request(ref, msg_id, arg, b) @msg.send_request(stream, ref, msg_id, arg, b) end |
#set_sockopt(soc) ⇒ Object
:nodoc:
1010 1011 1012 1013 1014 |
# File 'lib/drb/drb.rb', line 1010 def set_sockopt(soc) # :nodoc: soc.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) rescue IOError, Errno::ECONNRESET, Errno::EINVAL # closed/shutdown socket, ignore error end |
#shutdown ⇒ Object
Graceful shutdown
996 997 998 |
# File 'lib/drb/drb.rb', line 996 def shutdown @shutdown_pipe_w.close end |
#stream ⇒ Object
Get the socket.
923 |
# File 'lib/drb/drb.rb', line 923 def stream; @socket; end |