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.
902 903 904 905 906 907 908 909 910 |
# File 'lib/drb/drb.rb', line 902 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.
913 914 915 |
# File 'lib/drb/drb.rb', line 913 def uri @uri end |
Class Method Details
.getservername ⇒ Object
Returns the hostname of this server
844 845 846 847 848 849 850 851 852 853 854 855 |
# File 'lib/drb/drb.rb', line 844 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.
837 838 839 840 841 |
# File 'lib/drb/drb.rb', line 837 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
.
875 876 877 878 879 880 881 882 883 884 885 886 887 888 889 |
# File 'lib/drb/drb.rb', line 875 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.
860 861 862 863 864 865 866 867 868 869 870 871 |
# File 'lib/drb/drb.rb', line 860 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.
892 893 894 895 |
# File 'lib/drb/drb.rb', line 892 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.
970 971 972 973 974 975 976 977 978 979 980 981 982 983 |
# File 'lib/drb/drb.rb', line 970 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.
1000 1001 1002 1003 1004 1005 1006 1007 |
# File 'lib/drb/drb.rb', line 1000 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.
952 953 954 955 956 957 958 959 |
# File 'lib/drb/drb.rb', line 952 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.
917 918 919 |
# File 'lib/drb/drb.rb', line 917 def peeraddr @socket.peeraddr end |
#recv_reply ⇒ Object
On the client side, receive a reply from the server.
940 941 942 |
# File 'lib/drb/drb.rb', line 940 def recv_reply @msg.recv_reply(stream) end |
#recv_request ⇒ Object
On the server side, receive a request from the client.
930 931 932 |
# File 'lib/drb/drb.rb', line 930 def recv_request @msg.recv_request(stream) end |
#send_reply(succ, result) ⇒ Object
On the server side, send a reply to the client.
935 936 937 |
# File 'lib/drb/drb.rb', line 935 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.
925 926 927 |
# File 'lib/drb/drb.rb', line 925 def send_request(ref, msg_id, arg, b) @msg.send_request(stream, ref, msg_id, arg, b) end |
#set_sockopt(soc) ⇒ Object
:nodoc:
1009 1010 1011 1012 1013 |
# File 'lib/drb/drb.rb', line 1009 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
995 996 997 |
# File 'lib/drb/drb.rb', line 995 def shutdown @shutdown_pipe_w.close end |
#stream ⇒ Object
Get the socket.
922 |
# File 'lib/drb/drb.rb', line 922 def stream; @socket; end |