p2p2 0.19.0 → 0.24.0
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 +4 -4
- data/lib/p2p2/head.rb +3 -2
- data/lib/p2p2/p1_worker.rb +70 -64
- data/lib/p2p2/p2_worker.rb +58 -44
- data/lib/p2p2/p2pd_worker.rb +15 -15
- data/lib/p2p2/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c19c4e83055ee003d93923f5bc75aa21c2cfb8b678dd09f35405f4ccd7e93cb
|
4
|
+
data.tar.gz: b827a910f9dcbcf48712eb308da98d3231bf8ebe3dc66bf2a07138ef318bbea8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e1b716246402ff1f8cd6771b0607b78c3d54e754a7ea0189fb9168ad71294569943b7d641c2d3d77046d440cbd50bb22eb4f9cac092741ce6a6555ad3bcb255a
|
7
|
+
data.tar.gz: 730efff6c7c46ddb64d5f87196be76a47fe4aaf74a6a57bee493c76b83f9accc1c0501c4b15aa88a5bc71bdbf6f4e6441e44174fea25cb29605c474bb5641798
|
data/lib/p2p2/head.rb
CHANGED
@@ -6,12 +6,13 @@ module P2p2
|
|
6
6
|
RESUME_BELOW = 50_000 # 降到多少以下恢复写
|
7
7
|
EXPIRE_NEW = 10 # 创建之后多久没有流量进来,过期
|
8
8
|
EXPIRE_AFTER = 300 # 多久没有新流量,过期
|
9
|
-
CHECK_EXPIRE_INTERVAL =
|
9
|
+
CHECK_EXPIRE_INTERVAL = 60 # 检查过期间隔
|
10
10
|
STATUS_INTERVAL = 0.5 # 发送状态间隔
|
11
11
|
SEND_STATUS_UNTIL = 10 # 持续的告之对面状态,直到没有流量往来,持续多少秒
|
12
12
|
BREAK_SEND_MISS = 10_000 # miss包个数上限,达到上限忽略要后面的段,可控碎片缓存
|
13
13
|
CONFUSE_UNTIL = 5 # 混淆前几个包
|
14
|
-
|
14
|
+
HEARTBEAT_INTERVAL = 5 # 心跳间隔
|
15
|
+
UPDATE_ROOM_INTERVAL = 60 # 刷新房间间隔
|
15
16
|
PEER_ADDR = 1
|
16
17
|
HEARTBEAT = 2
|
17
18
|
A_NEW_SOURCE = 3
|
data/lib/p2p2/p1_worker.rb
CHANGED
@@ -28,8 +28,7 @@ module P2p2
|
|
28
28
|
#
|
29
29
|
def looping
|
30
30
|
puts "#{ Time.new } looping"
|
31
|
-
|
32
|
-
loop_check_expire
|
31
|
+
loop_heartbeat
|
33
32
|
loop_check_status
|
34
33
|
|
35
34
|
loop do
|
@@ -80,76 +79,65 @@ module P2p2
|
|
80
79
|
private
|
81
80
|
|
82
81
|
##
|
83
|
-
# loop
|
82
|
+
# loop heartbeat
|
84
83
|
#
|
85
|
-
def
|
84
|
+
def loop_heartbeat( check_at = Time.new )
|
86
85
|
Thread.new do
|
87
86
|
loop do
|
88
|
-
sleep
|
87
|
+
sleep HEARTBEAT_INTERVAL
|
89
88
|
|
90
89
|
@mutex.synchronize do
|
91
|
-
if !@tund.closed? && @tund_info[ :peer_addr ].nil?
|
92
|
-
now = Time.new
|
93
|
-
|
94
|
-
if now - update_at >= 60
|
95
|
-
data = @room
|
96
|
-
update_at = now
|
97
|
-
else
|
98
|
-
data = [ rand( 128 ) ].pack( 'C' )
|
99
|
-
end
|
100
|
-
|
101
|
-
add_tund_ctlmsg( data, @p2pd_addr )
|
102
|
-
next_tick
|
103
|
-
end
|
104
|
-
end
|
105
|
-
end
|
106
|
-
end
|
107
|
-
end
|
108
|
-
|
109
|
-
##
|
110
|
-
# loop check expire
|
111
|
-
#
|
112
|
-
def loop_check_expire
|
113
|
-
Thread.new do
|
114
|
-
loop do
|
115
|
-
sleep CHECK_EXPIRE_INTERVAL
|
116
|
-
|
117
|
-
@mutex.synchronize do
|
118
|
-
need_trigger = false
|
119
90
|
now = Time.new
|
120
91
|
|
121
|
-
|
122
|
-
if
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
92
|
+
unless @tund.closed?
|
93
|
+
if @tund_info[ :peer_addr ]
|
94
|
+
if @tund_info[ :tun_addr ]
|
95
|
+
if now - check_at >= CHECK_EXPIRE_INTERVAL
|
96
|
+
if now - @tund_info[ :last_recv_at ] > EXPIRE_AFTER
|
97
|
+
puts "#{ Time.new } expire tund"
|
98
|
+
set_is_closing( @tund )
|
99
|
+
else
|
100
|
+
@tund_info[ :dst_exts ].each do | dst_local_port, dst_ext |
|
101
|
+
if dst_ext[ :dst ].closed? && ( now - dst_ext[ :last_continue_at ] > EXPIRE_AFTER )
|
102
|
+
puts "#{ Time.new } expire dst ext"
|
103
|
+
del_dst_ext( dst_local_port )
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
@dst_infos.each do | dst, dst_info |
|
109
|
+
if now - dst_info[ :last_continue_at ] > EXPIRE_AFTER
|
110
|
+
puts "#{ Time.new } expire dst"
|
111
|
+
set_is_closing( dst )
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
check_at = now
|
133
116
|
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
|
-
need_trigger = true
|
138
|
-
end
|
139
117
|
|
140
|
-
|
141
|
-
|
118
|
+
# puts "debug2 heartbeat"
|
119
|
+
add_tund_ctlmsg( pack_a_heartbeat )
|
120
|
+
next_tick
|
121
|
+
elsif now - @tund_info[ :created_at ] > EXPIRE_NEW
|
122
|
+
# no tun addr
|
123
|
+
puts "#{ Time.new } expire new tund"
|
124
|
+
set_is_closing( @tund )
|
125
|
+
next_tick
|
126
|
+
end
|
127
|
+
else
|
128
|
+
# no peer addr
|
129
|
+
if now - check_at >= UPDATE_ROOM_INTERVAL
|
130
|
+
data = @room
|
131
|
+
check_at = now
|
132
|
+
else
|
133
|
+
data = [ rand( 128 ) ].pack( 'C' )
|
134
|
+
end
|
142
135
|
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
need_trigger = true
|
136
|
+
# puts "debug2 update room"
|
137
|
+
add_tund_ctlmsg( data, @p2pd_addr )
|
138
|
+
next_tick
|
147
139
|
end
|
148
140
|
end
|
149
|
-
|
150
|
-
if need_trigger
|
151
|
-
next_tick
|
152
|
-
end
|
153
141
|
end
|
154
142
|
end
|
155
143
|
end
|
@@ -531,6 +519,7 @@ module P2p2
|
|
531
519
|
# puts "debug2 write dst #{ written }"
|
532
520
|
data = data[ written..-1 ]
|
533
521
|
dst_info[ from ] = data
|
522
|
+
dst_info[ :last_continue_at ] = Time.new
|
534
523
|
end
|
535
524
|
|
536
525
|
##
|
@@ -551,6 +540,12 @@ module P2p2
|
|
551
540
|
tund.sendmsg( data, 0, to_addr )
|
552
541
|
rescue IO::WaitWritable, Errno::EINTR
|
553
542
|
return
|
543
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
544
|
+
puts "#{ Time.new } #{ e.class }, close tund"
|
545
|
+
close_tund( tund )
|
546
|
+
sleep HEARTBEAT_INTERVAL
|
547
|
+
new_a_tund
|
548
|
+
return
|
554
549
|
end
|
555
550
|
|
556
551
|
@tund_info[ :ctlmsgs ].shift
|
@@ -569,6 +564,12 @@ module P2p2
|
|
569
564
|
tund.sendmsg( data, 0, @tund_info[ :tun_addr ] )
|
570
565
|
rescue IO::WaitWritable, Errno::EINTR
|
571
566
|
return
|
567
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
568
|
+
puts "#{ Time.new } #{ e.class }, close tund"
|
569
|
+
close_tund( tund )
|
570
|
+
sleep HEARTBEAT_INTERVAL
|
571
|
+
new_a_tund
|
572
|
+
return
|
572
573
|
end
|
573
574
|
end
|
574
575
|
end
|
@@ -637,6 +638,12 @@ module P2p2
|
|
637
638
|
tund.sendmsg( data, 0, @tund_info[ :tun_addr ] )
|
638
639
|
rescue IO::WaitWritable, Errno::EINTR
|
639
640
|
return
|
641
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
642
|
+
puts "#{ Time.new } #{ e.class }, close tund"
|
643
|
+
close_tund( tund )
|
644
|
+
sleep HEARTBEAT_INTERVAL
|
645
|
+
new_a_tund
|
646
|
+
return
|
640
647
|
end
|
641
648
|
|
642
649
|
# puts "debug2 written pack #{ pack_id }"
|
@@ -673,7 +680,7 @@ module P2p2
|
|
673
680
|
|
674
681
|
# puts "debug2 read dst #{ data.inspect }"
|
675
682
|
dst_info = @dst_infos[ dst ]
|
676
|
-
dst_info[ :
|
683
|
+
dst_info[ :last_continue_at ] = Time.new
|
677
684
|
|
678
685
|
if @tund.closed?
|
679
686
|
puts "#{ Time.new } tund closed, close dst"
|
@@ -751,8 +758,7 @@ module P2p2
|
|
751
758
|
cache: '', # 块读出缓存
|
752
759
|
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
753
760
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
754
|
-
|
755
|
-
last_recv_at: nil, # 上一次收到流量的时间,过期关闭
|
761
|
+
last_continue_at: Time.new, # 上一次发生流量的时间
|
756
762
|
is_closing: false # 是否准备关闭
|
757
763
|
}
|
758
764
|
add_read( dst, :dst )
|
@@ -769,7 +775,7 @@ module P2p2
|
|
769
775
|
is_src_closed: false, # src是否已关闭
|
770
776
|
biggest_src_pack_id: 0, # src最大包号码
|
771
777
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
772
|
-
last_continue_at: Time.new #
|
778
|
+
last_continue_at: Time.new # 上一次发生流量的时间
|
773
779
|
}
|
774
780
|
end
|
775
781
|
|
data/lib/p2p2/p2_worker.rb
CHANGED
@@ -28,7 +28,7 @@ module P2p2
|
|
28
28
|
#
|
29
29
|
def looping
|
30
30
|
puts "#{ Time.new } looping"
|
31
|
-
|
31
|
+
loop_heartbeat
|
32
32
|
loop_check_status
|
33
33
|
|
34
34
|
loop do
|
@@ -81,49 +81,51 @@ module P2p2
|
|
81
81
|
private
|
82
82
|
|
83
83
|
##
|
84
|
-
# loop
|
84
|
+
# loop heartbeat
|
85
85
|
#
|
86
|
-
def
|
86
|
+
def loop_heartbeat( check_at = Time.new )
|
87
87
|
Thread.new do
|
88
88
|
loop do
|
89
|
-
sleep
|
89
|
+
sleep HEARTBEAT_INTERVAL
|
90
90
|
|
91
91
|
@mutex.synchronize do
|
92
|
-
need_trigger = false
|
93
92
|
now = Time.new
|
94
93
|
|
95
|
-
if @tun && !@tun.closed? && @tun_info[ :
|
96
|
-
if
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
94
|
+
if @tun && !@tun.closed? && @tun_info[ :peer_addr ]
|
95
|
+
if @tun_info[ :tund_addr ]
|
96
|
+
if now - check_at >= CHECK_EXPIRE_INTERVAL
|
97
|
+
if now - @tun_info[ :last_recv_at ] > EXPIRE_AFTER
|
98
|
+
puts "#{ Time.new } expire tun"
|
99
|
+
set_is_closing( @tun )
|
100
|
+
else
|
101
|
+
@tun_info[ :src_exts ].each do | src_id, src_ext |
|
102
|
+
if src_ext[ :src ].closed? && ( now - src_ext[ :last_continue_at ] > EXPIRE_AFTER )
|
103
|
+
puts "#{ Time.new } expire src ext"
|
104
|
+
del_src_ext( src_id )
|
105
|
+
end
|
106
|
+
end
|
107
107
|
end
|
108
|
-
end
|
109
|
-
end
|
110
108
|
|
111
|
-
|
112
|
-
|
109
|
+
@src_infos.each do | src, src_info |
|
110
|
+
if now - src_info[ :last_continue_at ] > EXPIRE_AFTER
|
111
|
+
puts "#{ Time.new } expire src"
|
112
|
+
set_is_closing( src )
|
113
|
+
end
|
114
|
+
end
|
113
115
|
|
114
|
-
|
115
|
-
|
116
|
+
check_at = now
|
117
|
+
end
|
116
118
|
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
119
|
+
# puts "debug2 heartbeat"
|
120
|
+
add_tun_ctlmsg( pack_a_heartbeat )
|
121
|
+
next_tick
|
122
|
+
elsif now - @tun_info[ :created_at ] > EXPIRE_NEW
|
123
|
+
# no tund addr
|
124
|
+
puts "#{ Time.new } expire new tun"
|
125
|
+
set_is_closing( @tun )
|
126
|
+
next_tick
|
121
127
|
end
|
122
128
|
end
|
123
|
-
|
124
|
-
if need_trigger
|
125
|
-
next_tick
|
126
|
-
end
|
127
129
|
end
|
128
130
|
end
|
129
131
|
end
|
@@ -261,7 +263,7 @@ module P2p2
|
|
261
263
|
@tun = tun
|
262
264
|
@tun_info = tun_info
|
263
265
|
add_read( tun, :tun )
|
264
|
-
add_tun_ctlmsg( @room, @p2pd_addr )
|
266
|
+
add_tun_ctlmsg( [ '2', @room ].join, @p2pd_addr )
|
265
267
|
end
|
266
268
|
|
267
269
|
##
|
@@ -544,6 +546,7 @@ module P2p2
|
|
544
546
|
# puts "debug2 write src #{ written }"
|
545
547
|
data = data[ written..-1 ]
|
546
548
|
src_info[ from ] = data
|
549
|
+
src_info[ :last_continue_at ] = Time.new
|
547
550
|
end
|
548
551
|
|
549
552
|
##
|
@@ -563,6 +566,10 @@ module P2p2
|
|
563
566
|
tun.sendmsg( data, 0, to_addr )
|
564
567
|
rescue IO::WaitWritable, Errno::EINTR
|
565
568
|
return
|
569
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
570
|
+
puts "#{ Time.new } #{ e.class }, close tun"
|
571
|
+
close_tun( tun )
|
572
|
+
return
|
566
573
|
end
|
567
574
|
|
568
575
|
@tun_info[ :ctlmsgs ].shift
|
@@ -581,6 +588,10 @@ module P2p2
|
|
581
588
|
tun.sendmsg( data, 0, @tun_info[ :tund_addr ] )
|
582
589
|
rescue IO::WaitWritable, Errno::EINTR
|
583
590
|
return
|
591
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
592
|
+
puts "#{ Time.new } #{ e.class }, close tun"
|
593
|
+
close_tun( tun )
|
594
|
+
return
|
584
595
|
end
|
585
596
|
end
|
586
597
|
end
|
@@ -649,6 +660,10 @@ module P2p2
|
|
649
660
|
tun.sendmsg( data, 0, @tun_info[ :tund_addr ] )
|
650
661
|
rescue IO::WaitWritable, Errno::EINTR
|
651
662
|
return
|
663
|
+
rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH => e
|
664
|
+
puts "#{ Time.new } #{ e.class }, close tun"
|
665
|
+
close_tun( tun )
|
666
|
+
return
|
652
667
|
end
|
653
668
|
|
654
669
|
# puts "debug2 written pack #{ pack_id }"
|
@@ -683,16 +698,15 @@ module P2p2
|
|
683
698
|
# puts "debug1 accept a src #{ addrinfo.inspect } #{ id }"
|
684
699
|
|
685
700
|
@src_infos[ src ] = {
|
686
|
-
id: id,
|
687
|
-
biggest_pack_id: 0,
|
688
|
-
rbuffs: [],
|
689
|
-
wbuff: '',
|
690
|
-
cache: '',
|
691
|
-
chunks: [],
|
692
|
-
spring: 0,
|
693
|
-
|
694
|
-
|
695
|
-
is_closing: false # 是否准备关闭
|
701
|
+
id: id, # id
|
702
|
+
biggest_pack_id: 0, # 最大包号码
|
703
|
+
rbuffs: [], # p1端dst未准备好,暂存流量 [ pack_id, data ]
|
704
|
+
wbuff: '', # 写前
|
705
|
+
cache: '', # 块读出缓存
|
706
|
+
chunks: [], # 块队列,写前达到块大小时结一个块 filename
|
707
|
+
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
708
|
+
last_continue_at: Time.new, # 上一次发生流量的时间
|
709
|
+
is_closing: false # 是否准备关闭
|
696
710
|
}
|
697
711
|
|
698
712
|
add_read( src, :src )
|
@@ -712,7 +726,7 @@ module P2p2
|
|
712
726
|
is_dst_closed: false, # dst是否已关闭
|
713
727
|
biggest_dst_pack_id: 0, # dst最大包号码
|
714
728
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
715
|
-
last_continue_at: Time.new #
|
729
|
+
last_continue_at: Time.new # 上一次发生流量的时间
|
716
730
|
}
|
717
731
|
|
718
732
|
@tun_info[ :src_exts ][ id ] = src_ext
|
@@ -736,7 +750,7 @@ module P2p2
|
|
736
750
|
|
737
751
|
# puts "debug2 read src #{ data.inspect }"
|
738
752
|
src_info = @src_infos[ src ]
|
739
|
-
src_info[ :
|
753
|
+
src_info[ :last_continue_at ] = Time.new
|
740
754
|
src_id = src_info[ :id ]
|
741
755
|
src_ext = @tun_info[ :src_exts ][ src_id ]
|
742
756
|
|
data/lib/p2p2/p2pd_worker.rb
CHANGED
@@ -32,17 +32,21 @@ module P2p2
|
|
32
32
|
data, addrinfo, rflags, *controls = p2pd.recvmsg
|
33
33
|
return if ( data.bytesize == 1 ) || ( data.bytesize > 255 ) || ( data =~ /\/|\.|\ / )
|
34
34
|
|
35
|
+
if data[0] == '2'
|
36
|
+
is_p2 = true
|
37
|
+
data = data[ 1..-1 ]
|
38
|
+
else
|
39
|
+
is_p2 = false
|
40
|
+
end
|
41
|
+
|
35
42
|
from_addr = addrinfo.to_sockaddr
|
36
43
|
room_path = File.join( @p2pd_tmp_dir, data.gsub( "\u0000" , '' ) )
|
37
44
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
if Time.new - File.mtime( room_path ) > EXPIRE_AFTER
|
45
|
-
puts "#{ Time.new } overwrite #{ room_path } #{ addrinfo.inspect }"
|
45
|
+
if is_p2
|
46
|
+
unless File.exist?( room_path )
|
47
|
+
return
|
48
|
+
end
|
49
|
+
else
|
46
50
|
write_room( room_path, from_addr )
|
47
51
|
return
|
48
52
|
end
|
@@ -50,13 +54,9 @@ module P2p2
|
|
50
54
|
op_addr = IO.binread( room_path )
|
51
55
|
op_addrinfo = Addrinfo.new( op_addr )
|
52
56
|
|
53
|
-
|
54
|
-
|
55
|
-
|
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
|
57
|
+
puts "#{ Time.new } paired #{ addrinfo.inspect } #{ op_addrinfo.inspect }"
|
58
|
+
send_pack( [ [ 0, PEER_ADDR ].pack( 'Q>C' ), op_addr ].join, from_addr )
|
59
|
+
send_pack( [ [ 0, PEER_ADDR ].pack( 'Q>C' ), from_addr ].join, op_addr )
|
60
60
|
end
|
61
61
|
|
62
62
|
def write_room( room_path, data )
|
data/lib/p2p2/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: p2p2
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.24.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- takafan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-07-
|
11
|
+
date: 2020-07-21 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 内网里的任意应用,访问另一个内网里的应用服务端。
|
14
14
|
email:
|
@@ -50,7 +50,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
50
50
|
version: '0'
|
51
51
|
requirements: []
|
52
52
|
rubyforge_project:
|
53
|
-
rubygems_version: 2.7.
|
53
|
+
rubygems_version: 2.7.7
|
54
54
|
signing_key:
|
55
55
|
specification_version: 4
|
56
56
|
summary: p2p
|