Class: DRb::DRbTCPSocket
- Inherits:
-
Object
- Object
- DRb::DRbTCPSocket
- Defined in:
- lib/drb/drb.rb
Overview
The default drb protocol.
Communicates over a TCP socket.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#uri ⇒ Object
readonly
Get the URI that we are connected to.
Class Method Summary collapse
- .getservername ⇒ Object
-
.open(uri, config) ⇒ Object
Open a client connection to
uri
using configurationconfig
. -
.open_server(uri, config) ⇒ Object
Open a server listening for connections at
uri
using configurationconfig
. - .open_server_inaddr_any(host, port) ⇒ Object
-
.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:.
-
#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.
885 886 887 888 889 890 891 892 |
# File 'lib/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 |
Instance Attribute Details
#uri ⇒ Object (readonly)
Get the URI that we are connected to.
895 896 897 |
# File 'lib/drb/drb.rb', line 895 def uri @uri end |
Class Method Details
.getservername ⇒ Object
830 831 832 833 834 835 836 837 |
# File 'lib/drb/drb.rb', line 830 def self.getservername host = Socket::gethostname begin Socket::gethostbyname(host)[0] rescue 'localhost' end end |
.open(uri, config) ⇒ Object
Open a client connection to uri
using configuration config
.
822 823 824 825 826 827 828 |
# File 'lib/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_server(uri, config) ⇒ Object
Open a server listening for connections at uri
using configuration config
.
858 859 860 861 862 863 864 865 866 867 868 869 870 871 872 |
# File 'lib/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 |
.open_server_inaddr_any(host, port) ⇒ Object
839 840 841 842 843 844 845 846 847 848 849 850 851 852 853 854 |
# File 'lib/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 |
.uri_option(uri, config) ⇒ Object
Parse uri
into a [uri, option] pair.
875 876 877 878 |
# File 'lib/drb/drb.rb', line 875 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.
944 945 946 947 948 949 950 951 952 953 954 955 956 |
# File 'lib/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 |
#alive? ⇒ Boolean
Check to see if this connection is alive.
959 960 961 962 963 964 965 966 |
# File 'lib/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 ⇒ 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.
934 935 936 937 938 939 |
# File 'lib/drb/drb.rb', line 934 def close if @socket @socket.close @socket = nil end end |
#peeraddr ⇒ Object
Get the address of our TCP peer (the other end of the socket we are bound to.
899 900 901 |
# File 'lib/drb/drb.rb', line 899 def peeraddr @socket.peeraddr end |
#recv_reply ⇒ Object
On the client side, receive a reply from the server.
922 923 924 |
# File 'lib/drb/drb.rb', line 922 def recv_reply @msg.recv_reply(stream) end |
#recv_request ⇒ Object
On the server side, receive a request from the client.
912 913 914 |
# File 'lib/drb/drb.rb', line 912 def recv_request @msg.recv_request(stream) end |
#send_reply(succ, result) ⇒ Object
On the server side, send a reply to the client.
917 918 919 |
# File 'lib/drb/drb.rb', line 917 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.
907 908 909 |
# File 'lib/drb/drb.rb', line 907 def send_request(ref, msg_id, arg, b) @msg.send_request(stream, ref, msg_id, arg, b) end |
#set_sockopt(soc) ⇒ Object
:nodoc:
968 969 970 971 |
# File 'lib/drb/drb.rb', line 968 def set_sockopt(soc) # :nodoc: soc.setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) soc.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC end |
#stream ⇒ Object
Get the socket.
904 |
# File 'lib/drb/drb.rb', line 904 def stream; @socket; end |