Class: RubyTorrent::Server
- Inherits:
-
Object
- Object
- RubyTorrent::Server
- Defined in:
- lib/rubytorrent/server.rb
Overview
The Server coordinates all Packages available on the machine. It instantiates one Controller for each Package. It's also responsible for the creation of all TCP connections---it sets up the TCP socket, receives incoming connections, validates handshakes, and hands them off to the appropriate Controller; it also creates outgoing connections (typically at Controllers' requests) and sends the handshake.
Constant Summary collapse
- VERSION =
0- PORT_RANGE =
(6881 .. 6889)
Instance Attribute Summary collapse
-
#http_proxy ⇒ Object
readonly
Returns the value of attribute http_proxy.
-
#id ⇒ Object
readonly
Returns the value of attribute id.
-
#port ⇒ Object
readonly
Returns the value of attribute port.
Instance Method Summary collapse
- #add_connection(name, cont, socket) ⇒ Object
- #add_torrent(mi, package, dlratelim = nil, ulratelim = nil) ⇒ Object
-
#initialize(hostname = nil, port = nil, http_proxy = ENV["http_proxy"]) ⇒ Server
constructor
A new instance of Server.
- #ip ⇒ Object
- #shutdown ⇒ Object
- #start ⇒ Object
- #to_s ⇒ Object
Constructor Details
#initialize(hostname = nil, port = nil, http_proxy = ENV["http_proxy"]) ⇒ Server
Returns a new instance of Server.
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
# File 'lib/rubytorrent/server.rb', line 34 def initialize(hostname=nil, port=nil, http_proxy=ENV["http_proxy"]) @http_proxy = http_proxy @server = nil if port.nil? @port = PORT_RANGE.detect do |p| begin @server = TCPServer.new(hostname, p) @port = p rescue Errno::EADDRINUSE @server = nil end !@server.nil? end raise Errno::EADDRINUSE, "ports #{PORT_RANGE}" unless @port else @server = TCPServer.new(hostname, port) @port = port end @id = "rubytor" + VERSION.chr + (1 .. 12).map { |x| rand(256).chr }.join @controllers = {} end |
Instance Attribute Details
#http_proxy ⇒ Object (readonly)
Returns the value of attribute http_proxy.
29 30 31 |
# File 'lib/rubytorrent/server.rb', line 29 def http_proxy @http_proxy end |
#id ⇒ Object (readonly)
Returns the value of attribute id.
29 30 31 |
# File 'lib/rubytorrent/server.rb', line 29 def id @id end |
#port ⇒ Object (readonly)
Returns the value of attribute port.
29 30 31 |
# File 'lib/rubytorrent/server.rb', line 29 def port @port end |
Instance Method Details
#add_connection(name, cont, socket) ⇒ Object
64 65 66 67 68 69 70 71 72 |
# File 'lib/rubytorrent/server.rb', line 64 def add_connection(name, cont, socket) begin shake_hands(socket, cont.info_hash) peer = PeerConnection.new(name, cont, socket, cont.package) cont.add_peer peer rescue ProtocolError => e socket.close rescue nil end end |
#add_torrent(mi, package, dlratelim = nil, ulratelim = nil) ⇒ Object
59 60 61 62 |
# File 'lib/rubytorrent/server.rb', line 59 def add_torrent(mi, package, dlratelim=nil, ulratelim=nil) @controllers[mi.info.sha1] = Controller.new(self, package, mi.info.sha1, mi.trackers, dlratelim, ulratelim, @http_proxy) @controllers[mi.info.sha1].start end |
#ip ⇒ Object
57 |
# File 'lib/rubytorrent/server.rb', line 57 def ip; @server.addr[3]; end |
#shutdown ⇒ Object
88 89 90 91 92 93 94 95 96 |
# File 'lib/rubytorrent/server.rb', line 88 def shutdown return if @shutdown @shutdown = true @server.close rescue nil @thread.join(0.2) @controllers.each { |hash, cont| cont.shutdown } self end |
#start ⇒ Object
74 75 76 77 78 79 80 81 82 83 84 85 86 |
# File 'lib/rubytorrent/server.rb', line 74 def start @shutdown = false @thread = Thread.new do begin while !@shutdown; receive; end rescue IOError, StandardError rt_warning "**** socket receive error, retrying" sleep 5 retry end end self end |
#to_s ⇒ Object
98 99 100 |
# File 'lib/rubytorrent/server.rb', line 98 def to_s "<#{self.class}: port #{port}, peer_id #{@id.inspect}>" end |