torrenter 0.0.4 → 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 992e0e356ed722f0cb7131a5029b454e6fdba9e2
4
- data.tar.gz: 64ae0a3e57481d38ac75668773303d2ab601fa91
3
+ metadata.gz: a3773b22bb18ac1dc0b3ccd2994889a9f21bbc84
4
+ data.tar.gz: cd433369ba505739ad4672dae2b5e81a8b048971
5
5
  SHA512:
6
- metadata.gz: bb19b53d0d740111e96941af9a02a07352979196ead79e1c34c796f42fdcec5d1aab7d6527b309f8cea84dec1513cc6b76b680f02c562f14c8993b7fa7a0353e
7
- data.tar.gz: a2870db5b56bfc2a887a2530ea924671fa677e0fb26ce0b80311148bf83a29b9457a2b8282e0ec9de832bfa8b401cecd9479eacac3441dd36f7ae342072e9273
6
+ metadata.gz: 0a25c88408740951f0400a2f723d5a02265a6d0a71e6af317b82913b3a58453f06bccd26af66349a8e276f25b56ca652b2ae7d1b392d98b7f4842cd9759ba233
7
+ data.tar.gz: 30b43deacc081ce8475a5e1ac83e058f10fdc7782a188d835e6da602438714f9e2a46b851f9d6fad83b8a84d498d84f39e62f5baa8e9c67f8e16ab5c2be77ea1
@@ -14,34 +14,19 @@ module Torrenter
14
14
  rescue *EXCEPTIONS
15
15
  @status = false
16
16
  ''
17
- # ''
18
- # rescue Errno::ECONNREFUSED
19
- # @status = false
20
- # ''
21
- # rescue Errno::EPIPE
22
- # @status = false
23
- # ''
24
17
  end
25
18
  end
26
19
 
27
20
  def recv_data(bytes=BLOCK, opts={})
28
21
  begin
29
- Timeout::timeout(2) { buffer << @socket.recv_nonblock(bytes) }
22
+ Timeout::timeout(5) { buffer << @socket.recv_nonblock(bytes) }
30
23
  rescue Timeout::Error
31
24
  ''
32
25
  rescue *EXCEPTIONS
33
26
  @status = false
34
27
  ''
35
- # ''
36
- # rescue Errno::ECONNREFUSED
37
- # ''
38
- # rescue Errno::ECONNRESET
39
- # ''
40
28
  rescue IO::EAGAINWaitReadable
41
29
  ''
42
- # rescue Errno::ETIMEDOUT
43
- # @status = false
44
- # @buffer = ''
45
30
  end
46
31
  end
47
32
 
@@ -131,6 +116,7 @@ module Torrenter
131
116
  elsif buffer.bytesize == 4 && buffer[0..3] == KEEP_ALIVE
132
117
  buffer.slice!(0..3)
133
118
  else
119
+
134
120
  # p @buffer[0..3].unp@buack("C*")
135
121
  case @buffer[4]
136
122
  when INTERESTED
@@ -144,17 +130,22 @@ module Torrenter
144
130
  parse_bitfield
145
131
  send_interested if buffer.empty?
146
132
  when PIECE
147
- @length = buffer[0..3].unpack("N*").first + 4
148
- if buffer.bytesize >= @length
133
+ @msg_length = buffer[0..3].unpack("N*").first + 4
149
134
 
135
+ if block_finished?
150
136
  buffer.slice!(0..12)
151
- # the metadata is slireced off.
152
- @offset += (@length - 13)
137
+
138
+ # the metadata is sliced off.
139
+
140
+ @offset += (@msg_length - 13)
141
+
153
142
  # buffer is reduced
143
+
154
144
  pack_buffer
155
145
  # that means the bytes for that block have been collected entirely.
156
146
  # the buffer becomes empty
157
147
  if pieces_remaining(master) > 1
148
+
158
149
  if piece_size == @piece_len
159
150
  pack_file(master)
160
151
  evaluate_index(master)
@@ -172,7 +163,7 @@ module Torrenter
172
163
  end
173
164
  end
174
165
  else
175
- recv_data(@length - buffer.bytesize)
166
+ recv_data(@msg_length - buffer.bytesize)
176
167
  end
177
168
  # piece
178
169
  when CHOKE
@@ -197,7 +188,7 @@ module Torrenter
197
188
  end
198
189
 
199
190
  def pack_buffer
200
- @block_map << @buffer.slice!(0...(@length - 13))
191
+ @block_map << @buffer.slice!(0...(@msg_length - 13))
201
192
  end
202
193
 
203
194
  def pack_file(master)
@@ -225,4 +216,12 @@ module Torrenter
225
216
  def pack(i)
226
217
  [i].pack("I>")
227
218
  end
219
+
220
+ def block_finished?
221
+ buffer.bytesize >= @msg_length
222
+ end
223
+
224
+ def piece_finished?
225
+
226
+ end
228
227
  end
@@ -1,13 +1,10 @@
1
- # contains the peer information
2
1
  module Torrenter
3
2
  class Peer
4
3
  include Torrenter
5
- # for non outside vars use the @ and remove them from
6
4
 
7
- attr_reader :socket, :peer, :sha_list, :piece_len, :info_hash, :status, :index
5
+ attr_reader :socket, :peer, :sha_list, :piece_len, :info_hash, :status, :index, :msg_length
8
6
  attr_accessor :piece_index, :offset, :buffer, :block_map
9
7
 
10
-
11
8
  def initialize(peer, file_list, peer_info={})
12
9
  @peer = peer
13
10
  @info_hash = peer_info[:info_hash]
@@ -32,7 +29,7 @@ module Torrenter
32
29
  def connect
33
30
  puts "\nConnecting to IP: #{peer[:ip]} PORT: #{peer[:port]}"
34
31
  begin
35
- Timeout::timeout(5) { @socket = TCPSocket.new(peer[:ip], peer[:port]) }
32
+ Timeout::timeout(1) { @socket = TCPSocket.new(peer[:ip], peer[:port]) }
36
33
  rescue Timeout::Error
37
34
  puts "Timed out."
38
35
  rescue Errno::EADDRNOTAVAIL
@@ -44,7 +41,7 @@ module Torrenter
44
41
  end
45
42
 
46
43
  if @socket
47
-
44
+ puts "Connected!"
48
45
  @socket.write(handshake)
49
46
  @status = true
50
47
  else
@@ -0,0 +1,17 @@
1
+ module Torrenter
2
+
3
+ # The buffer state should be responsible ONLY for the handling of non-metadata bytes.
4
+ # the messaging behavior should and ought to remain with the peer class, though
5
+ # in truth, it may be better if I didnt do that.
6
+
7
+ # So, if the state of the buffer reaches a certain step in its process involving the piece
8
+ # the buffer state should be fired off.
9
+
10
+ # instead of initialiazing it with the buffer,
11
+
12
+ class BufferState < Peer
13
+ def examine(buffer, msg_length)
14
+ binding.pry
15
+ end
16
+ end
17
+ end
@@ -31,31 +31,38 @@ module Torrenter
31
31
  def message_reactor
32
32
  modify_index
33
33
  if !@master_index.all? { |index| index == :downloaded }
34
- @peers.each { |peer| peer.connect if active_peers.size < 4 }
34
+ @peers.each { |peer| peer.connect if active_peers.size < 8 }
35
35
  puts "You are now connected to #{active_peers.size} peers."
36
36
  loop do
37
37
  break if @master_index.all? { |piece| piece == :downloaded }
38
38
  @peers.each do |peer|
39
39
  $update = { index: indices, peer_count: peer_data }
40
-
41
40
  piece_count = @master_index.count(:downloaded)
41
+
42
42
  if peer.status
43
43
  peer.state(@master_index, @blocks) # unless peer.piece_index.all? { |piece| piece == :downloaded }
44
+
44
45
  if @master_index.count(:downloaded) > piece_count
45
-
46
46
  system("clear")
47
47
  puts download_bar + "Downloading from #{active_peers.size} active peers"
48
48
  end
49
- elsif Time.now.to_i % 60 == 0
50
- peer.connect
49
+ else
50
+ @peers.each { |peer| peer.connect if Time.now.to_i % 60 == 0 }
51
51
  end
52
52
  end
53
53
  end
54
- stop_downloading
55
- seperate_data_dump_into_files
56
54
  else
57
- upload_data
55
+ # upload_data
58
56
  end
57
+ seperate_data_dump_into_files
58
+ end
59
+
60
+ def piece_done?(peer)
61
+
62
+ end
63
+
64
+ def block_done?(peer)
65
+
59
66
  end
60
67
 
61
68
  def indices
@@ -80,7 +87,7 @@ module Torrenter
80
87
  end
81
88
 
82
89
  def active_peers
83
- @peers.select { |peer| peer.index && peer.status }
90
+ @peers.select { |peer| peer.status }
84
91
  end
85
92
 
86
93
  def index_percentages
@@ -122,7 +129,7 @@ module Torrenter
122
129
  offset += length
123
130
  end
124
131
  else
125
- File.open("#{folder}/#{@file_list['name'].join}", 'w') { |data| data << File.read($data_dump) }
132
+ File.open("#{folder}/#{@file_list['name']}", 'w') { |data| data << File.read($data_dump) }
126
133
  end
127
134
  File.delete($data_dump)
128
135
  end
@@ -1,6 +1,3 @@
1
-
2
-
3
-
4
1
  module Torrenter
5
2
  class TorrentReader
6
3
  attr_reader :stream
@@ -10,6 +7,7 @@ module Torrenter
10
7
  @sha = Digest::SHA1.digest(stream['info'].bencode)
11
8
  @piece_length = stream['info']['piece length']
12
9
  @sha_list = stream['info']['pieces']
10
+ @sha_size = stream['info']['pieces'].size / 20
13
11
  end
14
12
 
15
13
  def determine_protocol
@@ -23,20 +21,24 @@ module Torrenter
23
21
  tracker = build_tracker(track)
24
22
 
25
23
  tracker.connect
24
+
26
25
  if tracker.connected?
27
26
  @peers = tracker.address_list
28
- break
29
27
  end
28
+
29
+ break if @peers
30
30
  end
31
31
 
32
- establish_reactor if @peers
32
+ if @peers
33
+ establish_reactor
34
+ end
33
35
  end
34
36
 
35
37
  def peer_info
36
38
  {
37
39
  :info_hash => @sha,
38
40
  :piece_length => @piece_length,
39
- :sha_list => @sha_list,
41
+ :sha_list => sha_pieces,
40
42
  :piece_index => Array.new(@sha_list.size) { false }
41
43
  }
42
44
  end
@@ -58,14 +60,13 @@ module Torrenter
58
60
  end
59
61
 
60
62
  def sha_pieces
61
- Array.new(@sha_list.bytesize / 20) { @sha_list.slice!(0..19) }
63
+ start, term = -20, 0
64
+ Array.new(@sha_size) { start += 20; term += 20; @sha_list[start...term]}
62
65
  end
63
66
 
64
67
  def establish_reactor
65
- react = Reactor.new(@peers, @sha_list, @piece_length, @file_list)
66
- begin
67
- react.message_reactor
68
- end
68
+ react = Reactor.new(@peers, sha_pieces, @piece_length, @file_list)
69
+ react.message_reactor
69
70
  end
70
71
  end
71
72
  end
@@ -37,17 +37,7 @@ module Torrenter
37
37
  Socket.getaddrinfo(@url, @port)[0][3]
38
38
  end
39
39
 
40
- def connect_to_udp_host
41
- begin
42
- @socket.connect(@ip, @port)
43
- return self
44
- rescue
45
- false
46
- end
47
- end
48
-
49
40
  def address_list
50
-
51
41
  @connection_id = @response[-8..-1]
52
42
  @transaction_id = [rand(10000)].pack("I>")
53
43
  send_msg(announce_msg)
@@ -55,7 +45,7 @@ module Torrenter
55
45
  read_response
56
46
 
57
47
  parse_announce if @response[0..3] == action(1)
58
- parse_addresses(@response, @response.size)
48
+ parse_addresses(@response, @response.size / 6)
59
49
  end
60
50
 
61
51
  def parse_announce
@@ -1,3 +1,3 @@
1
1
  module Torrenter
2
- VERSION = '0.0.4'
2
+ VERSION = '0.0.5'
3
3
  end
data/lib/torrenter.rb CHANGED
@@ -2,7 +2,7 @@ require 'socket'
2
2
  require 'digest/sha1'
3
3
  require 'bencode'
4
4
  require 'fileutils'
5
-
5
+ require 'pry'
6
6
  require 'torrenter/message/messager'
7
7
  require 'torrenter/message/message_types'
8
8
  require 'torrenter/peer'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: torrenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - wismer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-26 00:00:00.000000000 Z
11
+ date: 2014-04-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: BitTorrent Client written in Ruby
14
14
  email:
@@ -24,6 +24,7 @@ files:
24
24
  - lib/torrenter/message/message_types.rb
25
25
  - lib/torrenter/message/messager.rb
26
26
  - lib/torrenter/peer.rb
27
+ - lib/torrenter/peer_state.rb
27
28
  - lib/torrenter/reactor.rb
28
29
  - lib/torrenter/torrent_reader.rb
29
30
  - lib/torrenter/udp_tracker.rb