p2p2 0.22.0 → 0.27.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/p2p2.rb +3 -3
- data/lib/p2p2/concurrent_hash.rb +36 -0
- data/lib/p2p2/head.rb +11 -29
- data/lib/p2p2/p1.rb +57 -114
- data/lib/p2p2/p1_worker.rb +727 -927
- data/lib/p2p2/p2.rb +57 -114
- data/lib/p2p2/p2_worker.rb +682 -980
- data/lib/p2p2/paird.rb +42 -0
- data/lib/p2p2/paird_worker.rb +158 -0
- data/lib/p2p2/version.rb +3 -3
- data/p2p2.gemspec +32 -34
- metadata +10 -13
- data/lib/p2p2/custom.rb +0 -12
- data/lib/p2p2/p1_custom.rb +0 -7
- data/lib/p2p2/p2_custom.rb +0 -7
- data/lib/p2p2/p2pd.rb +0 -120
- data/lib/p2p2/p2pd_worker.rb +0 -78
data/lib/p2p2/p2pd_worker.rb
DELETED
@@ -1,78 +0,0 @@
|
|
1
|
-
module P2p2
|
2
|
-
class P2pdWorker
|
3
|
-
|
4
|
-
def initialize( p2pd_port, p2pd_tmp_dir )
|
5
|
-
p2pd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
|
6
|
-
p2pd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
|
7
|
-
p2pd.bind( Socket.pack_sockaddr_in( p2pd_port, '0.0.0.0' ) )
|
8
|
-
|
9
|
-
@p2pd = p2pd
|
10
|
-
@p2pd_tmp_dir = p2pd_tmp_dir
|
11
|
-
end
|
12
|
-
|
13
|
-
def looping
|
14
|
-
puts 'looping'
|
15
|
-
|
16
|
-
loop do
|
17
|
-
rs, _ = IO.select( [ @p2pd ] )
|
18
|
-
read_p2pd( rs.first )
|
19
|
-
end
|
20
|
-
rescue Interrupt => e
|
21
|
-
puts e.class
|
22
|
-
quit!
|
23
|
-
end
|
24
|
-
|
25
|
-
def quit!
|
26
|
-
exit
|
27
|
-
end
|
28
|
-
|
29
|
-
private
|
30
|
-
|
31
|
-
def read_p2pd( p2pd )
|
32
|
-
data, addrinfo, rflags, *controls = p2pd.recvmsg
|
33
|
-
return if ( data.bytesize == 1 ) || ( data.bytesize > 255 ) || ( data =~ /\/|\.|\ / )
|
34
|
-
|
35
|
-
from_addr = addrinfo.to_sockaddr
|
36
|
-
room_path = File.join( @p2pd_tmp_dir, data.gsub( "\u0000" , '' ) )
|
37
|
-
|
38
|
-
unless File.exist?( room_path )
|
39
|
-
puts "#{ Time.new } create #{ room_path } #{ addrinfo.inspect }"
|
40
|
-
write_room( room_path, from_addr )
|
41
|
-
return
|
42
|
-
end
|
43
|
-
|
44
|
-
if Time.new - File.mtime( room_path ) > EXPIRE_AFTER
|
45
|
-
puts "#{ Time.new } overwrite #{ room_path } #{ addrinfo.inspect }"
|
46
|
-
write_room( room_path, from_addr )
|
47
|
-
return
|
48
|
-
end
|
49
|
-
|
50
|
-
op_addr = IO.binread( room_path )
|
51
|
-
op_addrinfo = Addrinfo.new( op_addr )
|
52
|
-
|
53
|
-
if ( addrinfo.ip_address == op_addrinfo.ip_address ) || ( addrinfo.ip_port == op_addrinfo.ip_port )
|
54
|
-
write_room( room_path, from_addr )
|
55
|
-
else
|
56
|
-
puts "#{ Time.new } paired #{ addrinfo.inspect } #{ op_addrinfo.inspect }"
|
57
|
-
send_pack( [ [ 0, PEER_ADDR ].pack( 'Q>C' ), op_addr ].join, from_addr )
|
58
|
-
send_pack( [ [ 0, PEER_ADDR ].pack( 'Q>C' ), from_addr ].join, op_addr )
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def write_room( room_path, data )
|
63
|
-
begin
|
64
|
-
IO.binwrite( room_path, data )
|
65
|
-
rescue Errno::EISDIR, Errno::ENAMETOOLONG, Errno::ENOENT, ArgumentError => e
|
66
|
-
puts "binwrite #{ e.class } #{ Time.new }"
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
def send_pack( data, target_addr )
|
71
|
-
begin
|
72
|
-
@p2pd.sendmsg( data, 0, target_addr )
|
73
|
-
rescue IO::WaitWritable, Errno::EINTR => e
|
74
|
-
puts "#{ Time.new } sendmsg ignore #{ e.class }"
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
end
|