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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 76fa91db2c3174b30d207958c1363dfff3e299b2f5cea766a3002a793cd33e3c
4
- data.tar.gz: e6cfe0a6f60d1f6f5cce3c19edabc21631ef29d680d03a7c4e157a9f6d003312
3
+ metadata.gz: 4a5f46d1721cdfa12068de247463e0b44225c073d236928a30ffe726b81ad341
4
+ data.tar.gz: e53f2852e23d3e6679c1c961fdac1189663fa840729a9dc7bbac812c27fdbbf6
5
5
  SHA512:
6
- metadata.gz: 8d03a42f707fd4a4540f1f80fe9d7dff21aa9f713affbda68fb6057868f94f32b41f8ef48662bdc2fc046b8ccc19ce9a5f26d7771501a9f2c4561319b9fbb613
7
- data.tar.gz: 3bab16a0ad35bb0b6d42c4b1cef529ee9775fb0b717829bee3997a3ee73489766d348ad161d30fda4a0a558b9bcfd75b0dce388eb51af32579fabb8cbd182949
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
- add_read( ctlr )
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
- if p1_info[ :p2_addr ] && !p1_info[ :paused ]
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
- add_write( p1 )
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 ].delete( app_id )
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
- ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
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
- add_read( ctlr )
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[ :wbuffs ] << [ app.object_id, data ]
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
- if p2_info[ :p1_addr ] && !p2_info[ :paused ]
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
- add_write( p2 )
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
- ext = info[ :app_exts ][ app_id ]
238
- return if ext.nil? || ext[ :shadow_id ]
249
+ if buffs.any?
250
+ # puts "debug move #{ buffs.size } waiting buffs to wbuffs #{ Time.new } p#{ Process.pid }"
239
251
 
240
- ext[ :shadow_id ] = shadow_id
241
- info[ :shadow_ids ][ shadow_id ] = app_id
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 ].delete( shadow_id )
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
- ctlmsg = [ 0, HEARTBEAT, rand( 128 ) ].pack( 'Q>CC' )
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
- ext = p2_info[ :app_exts ][ app.object_id ]
775
+ app_id = app.object_id
776
+ shadow_id = p2_info[ :app_ids ][ app_id ]
756
777
 
757
- if ext.nil? || ext[ :shadow_id ]
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, app.object_id ].pack( 'Q>CQ>' )
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
@@ -1,3 +1,3 @@
1
1
  module P2p2
2
- VERSION = "0.8.8"
2
+ VERSION = "0.9.0"
3
3
  end
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.8.8
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-26 00:00:00.000000000 Z
11
+ date: 2019-08-28 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 内网里的任意应用,访问另一个内网里的应用服务端。
14
14
  email: