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 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: