p2p2 0.22.0 → 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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