p2p2 0.8.8 → 0.9.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/p1.rb +26 -16
- data/lib/p2p2/p2.rb +56 -24
- data/lib/p2p2/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a5f46d1721cdfa12068de247463e0b44225c073d236928a30ffe726b81ad341
|
4
|
+
data.tar.gz: e53f2852e23d3e6679c1c961fdac1189663fa840729a9dc7bbac812c27fdbbf6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d378a5d52df695c89a77ae9532c75bb19cf3c4b3a3de765e480f6ae8a7f09bfe3d77e8e7686a71e825a6ba7207061a9a467df758b21283f73f3056b7b0a4e0d3
|
7
|
+
data.tar.gz: 668f2a7d06f4e07dd0ad5adcd22a7fbc4bbd3c0bc7931fa4e0fa801c62b197fbefd52a13532feed14e877d36e9b047008033243f8dc682853cb03aeaa2dcdd9a
|
data/lib/p2p2/p1.rb
CHANGED
@@ -48,7 +48,7 @@ module P2p2
|
|
48
48
|
ctlr, ctlw = IO.pipe
|
49
49
|
@ctlw = ctlw
|
50
50
|
@roles[ ctlr ] = :ctlr
|
51
|
-
|
51
|
+
@reads << ctlr
|
52
52
|
end
|
53
53
|
|
54
54
|
def looping
|
@@ -155,7 +155,7 @@ module P2p2
|
|
155
155
|
p1_info[ :wbuffs ].clear
|
156
156
|
end
|
157
157
|
|
158
|
-
|
158
|
+
unless p1_info[ :paused ]
|
159
159
|
add_write( p1 )
|
160
160
|
end
|
161
161
|
end
|
@@ -176,15 +176,12 @@ module P2p2
|
|
176
176
|
return if sockaddr != @p2pd_sockaddr
|
177
177
|
|
178
178
|
unless info[ :p2_addr ]
|
179
|
-
# puts "debug peer addr #{ data[ 9..-1 ].inspect } #{ Time.new }"
|
180
179
|
info[ :p2_addr ] = data[ 9..-1 ]
|
180
|
+
# puts "debug peer addr #{ Addrinfo.new( info[ :p2_addr ] ).ip_unpack.inspect } #{ Time.new }"
|
181
181
|
info[ :last_traffic_at ] = now
|
182
|
-
|
182
|
+
send_heartbeat( p1 )
|
183
183
|
loop_send_status( p1 )
|
184
184
|
end
|
185
|
-
|
186
|
-
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
187
|
-
send_pack( p1, ctlmsg, info[ :p2_addr ] )
|
188
185
|
when A_NEW_APP
|
189
186
|
return if sockaddr != info[ :p2_addr ]
|
190
187
|
|
@@ -219,12 +216,13 @@ module P2p2
|
|
219
216
|
biggest_pack_id: 0, # 发到几
|
220
217
|
continue_app_pack_id: 0, # 收到几
|
221
218
|
pieces: {}, # 跳号包 app_pack_id => data
|
222
|
-
app_id: app_id, # 对面id
|
223
219
|
is_app_closed: false, # 对面是否已关闭
|
224
220
|
biggest_app_pack_id: 0, # 对面发到几
|
225
221
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
226
|
-
last_traffic_at: nil #
|
222
|
+
last_traffic_at: nil # 收到有效流量,或者发出流量的时间戳
|
227
223
|
}
|
224
|
+
|
225
|
+
info[ :shadow_ids ][ shadow_id ] = app_id
|
228
226
|
info[ :app_ids ][ app_id ] = shadow_id
|
229
227
|
add_read( shadow )
|
230
228
|
end
|
@@ -357,7 +355,7 @@ module P2p2
|
|
357
355
|
|
358
356
|
send_pack( p1, ctlmsg, info[ :p2_addr ] )
|
359
357
|
|
360
|
-
shadow_id = info[ :app_ids ]
|
358
|
+
shadow_id = info[ :app_ids ][ app_id ]
|
361
359
|
return unless shadow_id
|
362
360
|
|
363
361
|
del_shadow_ext( info, shadow_id )
|
@@ -377,6 +375,8 @@ module P2p2
|
|
377
375
|
return
|
378
376
|
end
|
379
377
|
|
378
|
+
return if sockaddr != info[ :p2_addr ]
|
379
|
+
|
380
380
|
shadow_id = info[ :app_ids ][ app_id ]
|
381
381
|
return unless shadow_id
|
382
382
|
|
@@ -589,13 +589,14 @@ module P2p2
|
|
589
589
|
chunks: [], # 块队列 filename
|
590
590
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
591
591
|
p2_addr: nil, # 远端地址
|
592
|
-
app_ids: {}, # app_id => shadow_id
|
593
592
|
shadow_exts: {}, # 长命信息 shadow_id => {}
|
593
|
+
shadow_ids: {}, # shadow_id => app_id
|
594
|
+
app_ids: {}, # app_id => shadow_id
|
594
595
|
fin1s: [], # fin1: shadow已关闭,等待对面收完流量 shadow_id
|
595
596
|
fin2s: [], # fin2: 流量已收完 shadow_id
|
596
597
|
paused: false, # 是否暂停写
|
597
598
|
resendings: [], # 重传队列 [ shadow_id, pack_id ]
|
598
|
-
last_traffic_at: nil #
|
599
|
+
last_traffic_at: nil # 收到有效流量,或者发出流量的时间戳
|
599
600
|
}
|
600
601
|
|
601
602
|
@p1 = p1
|
@@ -624,8 +625,7 @@ module P2p2
|
|
624
625
|
end
|
625
626
|
else
|
626
627
|
@mutex.synchronize do
|
627
|
-
|
628
|
-
send_pack( p1, ctlmsg, p1_info[ :p2_addr ] )
|
628
|
+
send_heartbeat( p1 )
|
629
629
|
end
|
630
630
|
end
|
631
631
|
end
|
@@ -732,6 +732,12 @@ module P2p2
|
|
732
732
|
end
|
733
733
|
end
|
734
734
|
|
735
|
+
def send_heartbeat( p1 )
|
736
|
+
info = @infos[ p1 ]
|
737
|
+
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
738
|
+
send_pack( p1, ctlmsg, info[ :p2_addr ] )
|
739
|
+
end
|
740
|
+
|
735
741
|
def send_pack( sock, data, target_sockaddr )
|
736
742
|
begin
|
737
743
|
sock.sendmsg( data, 0, target_sockaddr )
|
@@ -812,8 +818,6 @@ module P2p2
|
|
812
818
|
ext = p1_info[ :shadow_exts ].delete( shadow_id )
|
813
819
|
|
814
820
|
if ext
|
815
|
-
p1_info[ :app_ids ].delete( ext[ :app_id ] )
|
816
|
-
|
817
821
|
ext[ :chunks ].each do | filename |
|
818
822
|
begin
|
819
823
|
File.delete( File.join( @shadow_chunk_dir, filename ) )
|
@@ -821,6 +825,12 @@ module P2p2
|
|
821
825
|
end
|
822
826
|
end
|
823
827
|
end
|
828
|
+
|
829
|
+
app_id = p1_info[ :shadow_ids ].delete( shadow_id )
|
830
|
+
|
831
|
+
if app_id
|
832
|
+
p1_info[ :app_ids ].delete( app_id )
|
833
|
+
end
|
824
834
|
end
|
825
835
|
|
826
836
|
end
|
data/lib/p2p2/p2.rb
CHANGED
@@ -48,7 +48,7 @@ module P2p2
|
|
48
48
|
ctlr, ctlw = IO.pipe
|
49
49
|
@ctlw = ctlw
|
50
50
|
@roles[ ctlr ] = :ctlr
|
51
|
-
|
51
|
+
@reads << ctlr
|
52
52
|
end
|
53
53
|
|
54
54
|
def looping
|
@@ -142,6 +142,7 @@ module P2p2
|
|
142
142
|
p2: @p2
|
143
143
|
}
|
144
144
|
|
145
|
+
@p2_info[ :waitings ][ app_id ] = []
|
145
146
|
@p2_info[ :app_exts ][ app_id ] = {
|
146
147
|
app: app,
|
147
148
|
wbuff: '', # 写前缓存
|
@@ -153,11 +154,10 @@ module P2p2
|
|
153
154
|
biggest_pack_id: 0, # 发到几
|
154
155
|
continue_shadow_pack_id: 0, # 收到几
|
155
156
|
pieces: {}, # 跳号包 shadow_pack_id => data
|
156
|
-
shadow_id: nil, # 对面id
|
157
157
|
is_shadow_closed: false, # 对面是否已关闭
|
158
158
|
biggest_shadow_pack_id: 0, # 对面发到几
|
159
159
|
completed_pack_id: 0, # 完成到几(对面收到几)
|
160
|
-
last_traffic_at: nil #
|
160
|
+
last_traffic_at: nil # 收到有效流量,或者发出流量的时间戳
|
161
161
|
}
|
162
162
|
|
163
163
|
add_read( app )
|
@@ -185,8 +185,16 @@ module P2p2
|
|
185
185
|
return
|
186
186
|
end
|
187
187
|
|
188
|
+
app_id = app.object_id
|
188
189
|
p2_info = @infos[ p2 ]
|
189
|
-
p2_info[ :
|
190
|
+
shadow_id = p2_info[ :app_ids ][ app_id ]
|
191
|
+
|
192
|
+
if p2_info[ :p1_addr ].nil? || shadow_id.nil?
|
193
|
+
p2_info[ :waitings ][ app_id ] << data
|
194
|
+
return
|
195
|
+
end
|
196
|
+
|
197
|
+
p2_info[ :wbuffs ] << [ app_id, data ]
|
190
198
|
|
191
199
|
if p2_info[ :wbuffs ].size >= WBUFFS_LIMIT
|
192
200
|
spring = p2_info[ :chunks ].size > 0 ? ( p2_info[ :spring ] + 1 ) : 0
|
@@ -198,11 +206,13 @@ module P2p2
|
|
198
206
|
p2_info[ :wbuffs ].clear
|
199
207
|
end
|
200
208
|
|
201
|
-
|
209
|
+
unless p2_info[ :paused ]
|
202
210
|
add_write( p2 )
|
203
211
|
end
|
204
212
|
end
|
205
213
|
|
214
|
+
|
215
|
+
|
206
216
|
##
|
207
217
|
# read p2
|
208
218
|
#
|
@@ -219,26 +229,33 @@ module P2p2
|
|
219
229
|
return if sockaddr != @p2pd_sockaddr
|
220
230
|
|
221
231
|
unless info[ :p1_addr ]
|
222
|
-
# puts "debug peer addr #{ data[ 9..-1 ].inspect } #{ Time.new }"
|
223
232
|
info[ :p1_addr ] = data[ 9..-1 ]
|
233
|
+
# puts "debug peer addr #{ Addrinfo.new( info[ :p1_addr ] ).ip_unpack.inspect } #{ Time.new }"
|
224
234
|
info[ :last_traffic_at ] = now
|
225
|
-
|
235
|
+
send_heartbeat( p2 )
|
226
236
|
loop_send_status( p2 )
|
227
237
|
end
|
228
|
-
|
229
|
-
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
230
|
-
send_pack( p2, ctlmsg, info[ :p1_addr ] )
|
231
238
|
when PAIRED
|
232
239
|
return if sockaddr != info[ :p1_addr ]
|
233
240
|
|
234
241
|
app_id, shadow_id = data[ 9, 16 ].unpack( 'Q>Q>' )
|
242
|
+
return if info[ :app_ids ].include?( app_id )
|
243
|
+
|
235
244
|
# puts "debug got PAIRED #{ app_id } #{ shadow_id } #{ Time.new }"
|
245
|
+
info[ :app_ids ][ app_id ] = shadow_id
|
246
|
+
info[ :shadow_ids ][ shadow_id ] = app_id
|
247
|
+
buffs = info[ :waitings ][ app_id ]
|
236
248
|
|
237
|
-
|
238
|
-
|
249
|
+
if buffs.any?
|
250
|
+
# puts "debug move #{ buffs.size } waiting buffs to wbuffs #{ Time.new } p#{ Process.pid }"
|
239
251
|
|
240
|
-
|
241
|
-
|
252
|
+
buffs.each do | buff |
|
253
|
+
info[ :wbuffs ] << [ app_id, buff ]
|
254
|
+
end
|
255
|
+
|
256
|
+
buffs.clear
|
257
|
+
add_write( p2 )
|
258
|
+
end
|
242
259
|
when SHADOW_STATUS
|
243
260
|
return if sockaddr != info[ :p1_addr ]
|
244
261
|
|
@@ -358,7 +375,7 @@ module P2p2
|
|
358
375
|
|
359
376
|
send_pack( p2, ctlmsg, info[ :p1_addr ] )
|
360
377
|
|
361
|
-
app_id = info[ :shadow_ids ]
|
378
|
+
app_id = info[ :shadow_ids ][ shadow_id ]
|
362
379
|
return unless app_id
|
363
380
|
|
364
381
|
del_app_ext( info, app_id )
|
@@ -376,6 +393,8 @@ module P2p2
|
|
376
393
|
return
|
377
394
|
end
|
378
395
|
|
396
|
+
return if sockaddr != info[ :p1_addr ]
|
397
|
+
|
379
398
|
app_id = info[ :shadow_ids ][ shadow_id ]
|
380
399
|
return unless app_id
|
381
400
|
|
@@ -592,18 +611,20 @@ module P2p2
|
|
592
611
|
p2.bind( Socket.sockaddr_in( 0, '0.0.0.0' ) )
|
593
612
|
|
594
613
|
p2_info = {
|
614
|
+
waitings: {}, # 还没连上p1,或者还没配上shadow,暂存流量 app_id => buffs[]
|
595
615
|
wbuffs: [], # 写前缓存 [ app_id, data ]
|
596
616
|
caches: [], # 块读出缓存 [ app_id, data ]
|
597
617
|
chunks: [], # 块队列 filename
|
598
618
|
spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
|
599
619
|
p1_addr: nil, # 远端地址
|
600
|
-
shadow_ids: {}, # shadow_id => app_id
|
601
620
|
app_exts: {}, # 传输相关 app_id => {}
|
621
|
+
app_ids: {}, # app_id => shadow_id
|
622
|
+
shadow_ids: {}, # shadow_id => app_id
|
602
623
|
fin1s: [], # fin1: app已关闭,等待对面收完流量 app_id
|
603
624
|
fin2s: [], # fin2: 流量已收完 app_id
|
604
625
|
paused: false, # 是否暂停写
|
605
626
|
resendings: [], # 重传队列 [ app_id, pack_id ]
|
606
|
-
last_traffic_at: nil #
|
627
|
+
last_traffic_at: nil # 收到有效流量,或者发出流量的时间戳
|
607
628
|
}
|
608
629
|
|
609
630
|
@p2 = p2
|
@@ -632,8 +653,7 @@ module P2p2
|
|
632
653
|
end
|
633
654
|
else
|
634
655
|
@mutex.synchronize do
|
635
|
-
|
636
|
-
send_pack( p2, ctlmsg, p2_info[ :p1_addr ] )
|
656
|
+
send_heartbeat( p2 )
|
637
657
|
end
|
638
658
|
end
|
639
659
|
end
|
@@ -752,15 +772,16 @@ module P2p2
|
|
752
772
|
p2_info = @infos[ p2 ]
|
753
773
|
|
754
774
|
if p2_info[ :p1_addr ]
|
755
|
-
|
775
|
+
app_id = app.object_id
|
776
|
+
shadow_id = p2_info[ :app_ids ][ app_id ]
|
756
777
|
|
757
|
-
if
|
778
|
+
if shadow_id
|
758
779
|
# puts "debug break a new app loop #{ Time.new }"
|
759
780
|
break
|
760
781
|
end
|
761
782
|
|
762
783
|
@mutex.synchronize do
|
763
|
-
ctlmsg = [ 0, A_NEW_APP,
|
784
|
+
ctlmsg = [ 0, A_NEW_APP, app_id ].pack( 'Q>CQ>' )
|
764
785
|
# puts "debug send a new app #{ Time.new }"
|
765
786
|
send_pack( p2, ctlmsg, p2_info[ :p1_addr ] )
|
766
787
|
end
|
@@ -771,6 +792,12 @@ module P2p2
|
|
771
792
|
end
|
772
793
|
end
|
773
794
|
|
795
|
+
def send_heartbeat( p2 )
|
796
|
+
info = @infos[ p2 ]
|
797
|
+
ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
|
798
|
+
send_pack( p2, ctlmsg, info[ :p1_addr ] )
|
799
|
+
end
|
800
|
+
|
774
801
|
def send_pack( sock, data, target_sockaddr )
|
775
802
|
begin
|
776
803
|
sock.sendmsg( data, 0, target_sockaddr )
|
@@ -842,11 +869,10 @@ module P2p2
|
|
842
869
|
end
|
843
870
|
|
844
871
|
def del_app_ext( p2_info, app_id )
|
872
|
+
p2_info[ :waitings ].delete( app_id )
|
845
873
|
ext = p2_info[ :app_exts ].delete( app_id )
|
846
874
|
|
847
875
|
if ext
|
848
|
-
p2_info[ :shadow_ids ].delete( ext[ :shadow_id ] )
|
849
|
-
|
850
876
|
ext[ :chunks ].each do | filename |
|
851
877
|
begin
|
852
878
|
File.delete( File.join( @app_chunk_dir, filename ) )
|
@@ -854,6 +880,12 @@ module P2p2
|
|
854
880
|
end
|
855
881
|
end
|
856
882
|
end
|
883
|
+
|
884
|
+
shadow_id = p2_info[ :app_ids ].delete( app_id )
|
885
|
+
|
886
|
+
if shadow_id
|
887
|
+
p2_info[ :shadow_ids ].delete( shadow_id )
|
888
|
+
end
|
857
889
|
end
|
858
890
|
|
859
891
|
end
|
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.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- takafan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2019-08-
|
11
|
+
date: 2019-08-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 内网里的任意应用,访问另一个内网里的应用服务端。
|
14
14
|
email:
|