p2p2 0.8.8 → 0.9.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/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:
|