p2p2 0.21.0 → 0.26.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: 57e288ebc806c2661f7fa5314a9be3fa16bbb1dc2deac96cfce9f3ca65c97bea
4
- data.tar.gz: e7872fc331f68d07aaf16b02ea95fd3cdcc09f122acc4b16a51eeb49c5cac854
3
+ metadata.gz: 8b794e3b18c3c83d28013dc743181bd0f72ff9dc1c692266f68d360ebcc3855b
4
+ data.tar.gz: 99ff62c980d909c10d412f076d7aac4e81afe195a824c7fd36b6ac78b2c7e777
5
5
  SHA512:
6
- metadata.gz: 665ea51b965d27fdd38fabcdbab4ab7932a9cad6ca70d4503a4c452597979eee6598706b4f8d15670a188742a14375805cb8f9eb2e919c7c48bc8917f2a3a0b4
7
- data.tar.gz: 7263370934487b9e3937931cbefb13feedce4b14c30fb3c25f6c3119f41fe9d878e4b18a70cbb733267bcc95b6ba39abe097a4bcb1cf35b474cad04dd1379a92
6
+ metadata.gz: b6cf3c77031cf3f53d1f8f884daca762140f68ff40c2538618058a2ffa8747d8c722069e432c02b3165ee3451545c82cd43177ba38e80218459c91b5a37bd978
7
+ data.tar.gz: 177432a07d6976627d629658dd8e61ac105d538225e43af30842fe05d4378abfd2be28d47b4c2616a0e733b80228a6badcf33f21c9464cfe5ff3ce78a0c16d2a
@@ -6,7 +6,7 @@ require 'p2p2/version'
6
6
  require 'socket'
7
7
 
8
8
  ##
9
- # P2p2::P1 - 内网里的任意应用,访问另一个内网里的应用服务端。p1端。
9
+ # P2p2::P1 - p2p通道,p1端。
10
10
  #
11
11
  module P2p2
12
12
  class P1
@@ -90,7 +90,7 @@ module P2p2
90
90
  now = Time.new
91
91
 
92
92
  unless @tund.closed?
93
- if @tund_info[ :peer_addr ]
93
+ if @tund_info[ :peer_addr ] && @tund_info[ :peer_at ]
94
94
  if @tund_info[ :tun_addr ]
95
95
  if now - check_at >= CHECK_EXPIRE_INTERVAL
96
96
  if now - @tund_info[ :last_recv_at ] > EXPIRE_AFTER
@@ -99,14 +99,14 @@ module P2p2
99
99
  else
100
100
  @tund_info[ :dst_exts ].each do | dst_local_port, dst_ext |
101
101
  if dst_ext[ :dst ].closed? && ( now - dst_ext[ :last_continue_at ] > EXPIRE_AFTER )
102
- puts "#{ Time.new } expire dst ext #{ dst_local_port }"
102
+ puts "#{ Time.new } expire dst ext"
103
103
  del_dst_ext( dst_local_port )
104
104
  end
105
105
  end
106
106
  end
107
107
 
108
108
  @dst_infos.each do | dst, dst_info |
109
- if dst_info[ :last_recv_at ].nil? && ( now - dst_info[ :created_at ] > EXPIRE_NEW )
109
+ if now - dst_info[ :last_continue_at ] > EXPIRE_AFTER
110
110
  puts "#{ Time.new } expire dst"
111
111
  set_is_closing( dst )
112
112
  end
@@ -118,8 +118,7 @@ module P2p2
118
118
  # puts "debug2 heartbeat"
119
119
  add_tund_ctlmsg( pack_a_heartbeat )
120
120
  next_tick
121
- elsif now - @tund_info[ :created_at ] > EXPIRE_NEW
122
- # no tun addr
121
+ elsif now - @tund_info[ :peer_at ] > EXPIRE_NEW
123
122
  puts "#{ Time.new } expire new tund"
124
123
  set_is_closing( @tund )
125
124
  next_tick
@@ -221,7 +220,8 @@ module P2p2
221
220
  caches: [], # 块读出缓存 [ dst_local_port, pack_id, data ]
222
221
  chunks: [], # 块队列 filename
223
222
  spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
224
- peer_addr: nil, # 对面地址
223
+ peer_addr: nil, # 配对地址
224
+ peer_at: nil, # 收到配对地址时间
225
225
  tun_addr: nil, # 连通后的tun地址
226
226
  dst_exts: {}, # dst额外信息 dst_local_port => {}
227
227
  dst_local_ports: {}, # src_id => dst_local_port
@@ -374,6 +374,25 @@ module P2p2
374
374
  end
375
375
  end
376
376
 
377
+ ##
378
+ # send data
379
+ #
380
+ def send_data( tund, data, to_addr )
381
+ begin
382
+ tund.sendmsg( data, 0, to_addr )
383
+ rescue IO::WaitWritable, Errno::EINTR
384
+ return false
385
+ rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH, Errno::ENETDOWN => e
386
+ puts "#{ Time.new } #{ e.class }, close tund"
387
+ close_tund( tund )
388
+ sleep HEARTBEAT_INTERVAL
389
+ new_a_tund
390
+ return false
391
+ end
392
+
393
+ true
394
+ end
395
+
377
396
  ##
378
397
  # close dst
379
398
  #
@@ -475,15 +494,14 @@ module P2p2
475
494
  #
476
495
  def write_dst( dst )
477
496
  dst_info = @dst_infos[ dst ]
478
- data = dst_info[ :cache ]
479
- from = :cache
497
+ from, data = :cache, dst_info[ :cache ]
480
498
 
481
499
  if data.empty?
482
500
  if dst_info[ :chunks ].any?
483
501
  path = File.join( @dst_chunk_dir, dst_info[ :chunks ].shift )
484
502
 
485
503
  begin
486
- dst_info[ :cache ] = data = IO.binread( path )
504
+ data = dst_info[ :cache ] = IO.binread( path )
487
505
  File.delete( path )
488
506
  rescue Errno::ENOENT => e
489
507
  puts "#{ Time.new } read #{ path } #{ e.class }"
@@ -491,8 +509,7 @@ module P2p2
491
509
  return
492
510
  end
493
511
  else
494
- data = dst_info[ :wbuff ]
495
- from = :wbuff
512
+ from, data = :wbuff, dst_info[ :wbuff ]
496
513
  end
497
514
  end
498
515
 
@@ -519,6 +536,7 @@ module P2p2
519
536
  # puts "debug2 write dst #{ written }"
520
537
  data = data[ written..-1 ]
521
538
  dst_info[ from ] = data
539
+ dst_info[ :last_continue_at ] = Time.new
522
540
  end
523
541
 
524
542
  ##
@@ -531,13 +549,13 @@ module P2p2
531
549
  return
532
550
  end
533
551
 
552
+ now = Time.new
553
+
534
554
  # 传ctlmsg
535
555
  while @tund_info[ :ctlmsgs ].any?
536
556
  to_addr, data = @tund_info[ :ctlmsgs ].first
537
557
 
538
- begin
539
- tund.sendmsg( data, 0, to_addr )
540
- rescue IO::WaitWritable, Errno::EINTR
558
+ unless send_data( tund, data, to_addr )
541
559
  return
542
560
  end
543
561
 
@@ -553,16 +571,15 @@ module P2p2
553
571
  data = dst_ext[ :wmems ][ pack_id ]
554
572
 
555
573
  if data
556
- begin
557
- tund.sendmsg( data, 0, @tund_info[ :tun_addr ] )
558
- rescue IO::WaitWritable, Errno::EINTR
574
+ unless send_data( tund, data, @tund_info[ :tun_addr ] )
559
575
  return
560
576
  end
577
+
578
+ dst_ext[ :last_continue_at ] = now
561
579
  end
562
580
  end
563
581
 
564
582
  @tund_info[ :resendings ].shift
565
- return
566
583
  end
567
584
 
568
585
  # 若写后达到上限,暂停取写前
@@ -578,8 +595,7 @@ module P2p2
578
595
 
579
596
  # 取写前
580
597
  if @tund_info[ :caches ].any?
581
- dst_local_port, pack_id, data = @tund_info[ :caches ].first
582
- from = :caches
598
+ datas = @tund_info[ :caches ]
583
599
  elsif @tund_info[ :chunks ].any?
584
600
  path = File.join( @tund_chunk_dir, @tund_info[ :chunks ].shift )
585
601
 
@@ -600,42 +616,39 @@ module P2p2
600
616
  data = data[ ( 12 + pack_size )..-1 ]
601
617
  end
602
618
 
603
- @tund_info[ :caches ] = caches
604
- dst_local_port, pack_id, data = caches.first
605
- from = :caches
619
+ datas = @tund_info[ :caches ] = caches
606
620
  elsif @tund_info[ :wbuffs ].any?
607
- dst_local_port, pack_id, data = @tund_info[ :wbuffs ].first
608
- from = :wbuffs
621
+ datas = @tund_info[ :wbuffs ]
609
622
  else
610
623
  @writes.delete( tund )
611
624
  return
612
625
  end
613
626
 
614
- dst_ext = @tund_info[ :dst_exts ][ dst_local_port ]
627
+ while datas.any?
628
+ dst_local_port, pack_id, data = datas.first
629
+ dst_ext = @tund_info[ :dst_exts ][ dst_local_port ]
615
630
 
616
- if dst_ext
617
- if pack_id <= CONFUSE_UNTIL
618
- data = @custom.encode( data )
619
- # puts "debug1 encoded pack #{ pack_id }"
620
- end
631
+ if dst_ext
632
+ if pack_id <= CONFUSE_UNTIL
633
+ data = @custom.encode( data )
634
+ # puts "debug1 encoded pack #{ pack_id }"
635
+ end
621
636
 
622
- data = [ [ pack_id, dst_local_port ].pack( 'Q>n' ), data ].join
637
+ data = [ [ pack_id, dst_local_port ].pack( 'Q>n' ), data ].join
623
638
 
624
- begin
625
- tund.sendmsg( data, 0, @tund_info[ :tun_addr ] )
626
- rescue IO::WaitWritable, Errno::EINTR
627
- return
639
+ unless send_data( tund, data, @tund_info[ :tun_addr ] )
640
+ return
641
+ end
642
+
643
+ # puts "debug2 written pack #{ pack_id }"
644
+ dst_ext[ :relay_pack_id ] = pack_id
645
+ dst_ext[ :wmems ][ pack_id ] = data
646
+ dst_ext[ :send_ats ][ pack_id ] = now
647
+ dst_ext[ :last_continue_at ] = now
628
648
  end
629
649
 
630
- # puts "debug2 written pack #{ pack_id }"
631
- now = Time.new
632
- dst_ext[ :relay_pack_id ] = pack_id
633
- dst_ext[ :wmems ][ pack_id ] = data
634
- dst_ext[ :send_ats ][ pack_id ] = now
635
- dst_ext[ :last_continue_at ] = now
650
+ datas.shift
636
651
  end
637
-
638
- @tund_info[ from ].shift
639
652
  end
640
653
 
641
654
  ##
@@ -661,7 +674,7 @@ module P2p2
661
674
 
662
675
  # puts "debug2 read dst #{ data.inspect }"
663
676
  dst_info = @dst_infos[ dst ]
664
- dst_info[ :last_recv_at ] = Time.new
677
+ dst_info[ :last_continue_at ] = Time.new
665
678
 
666
679
  if @tund.closed?
667
680
  puts "#{ Time.new } tund closed, close dst"
@@ -693,6 +706,7 @@ module P2p2
693
706
  puts "#{ Time.new } got peer addr #{ Addrinfo.new( peer_addr ).inspect }"
694
707
 
695
708
  @tund_info[ :peer_addr ] = peer_addr
709
+ @tund_info[ :peer_at ] = now
696
710
  loop_punch_peer
697
711
  when HEARTBEAT
698
712
  from_addr = addrinfo.to_sockaddr
@@ -739,8 +753,7 @@ module P2p2
739
753
  cache: '', # 块读出缓存
740
754
  chunks: [], # 块队列,写前达到块大小时结一个块 filename
741
755
  spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
742
- created_at: Time.new, # 创建时间
743
- last_recv_at: nil, # 上一次收到流量的时间,过期关闭
756
+ last_continue_at: Time.new, # 上一次发生流量的时间
744
757
  is_closing: false # 是否准备关闭
745
758
  }
746
759
  add_read( dst, :dst )
@@ -757,7 +770,7 @@ module P2p2
757
770
  is_src_closed: false, # src是否已关闭
758
771
  biggest_src_pack_id: 0, # src最大包号码
759
772
  completed_pack_id: 0, # 完成到几(对面收到几)
760
- last_continue_at: Time.new # 创建,或者上一次收到连续流量,或者发出新包的时间
773
+ last_continue_at: Time.new # 上一次发生流量的时间
761
774
  }
762
775
  end
763
776
 
@@ -6,7 +6,7 @@ require 'p2p2/version'
6
6
  require 'socket'
7
7
 
8
8
  ##
9
- # P2p2::P2 - 内网里的任意应用,访问另一个内网里的应用服务端。p2端。
9
+ # P2p2::P2 - p2p通道,p2端。
10
10
  #
11
11
  module P2p2
12
12
  class P2
@@ -91,7 +91,7 @@ module P2p2
91
91
  @mutex.synchronize do
92
92
  now = Time.new
93
93
 
94
- if @tun && !@tun.closed? && @tun_info[ :peer_addr ]
94
+ if @tun && !@tun.closed? && @tun_info[ :peer_addr ] && @tun_info[ :peer_at ]
95
95
  if @tun_info[ :tund_addr ]
96
96
  if now - check_at >= CHECK_EXPIRE_INTERVAL
97
97
  if now - @tun_info[ :last_recv_at ] > EXPIRE_AFTER
@@ -100,14 +100,14 @@ module P2p2
100
100
  else
101
101
  @tun_info[ :src_exts ].each do | src_id, src_ext |
102
102
  if src_ext[ :src ].closed? && ( now - src_ext[ :last_continue_at ] > EXPIRE_AFTER )
103
- puts "#{ Time.new } expire src ext #{ src_id }"
103
+ puts "#{ Time.new } expire src ext"
104
104
  del_src_ext( src_id )
105
105
  end
106
106
  end
107
107
  end
108
108
 
109
109
  @src_infos.each do | src, src_info |
110
- if src_info[ :last_recv_at ].nil? && ( now - src_info[ :created_at ] > EXPIRE_NEW )
110
+ if now - src_info[ :last_continue_at ] > EXPIRE_AFTER
111
111
  puts "#{ Time.new } expire src"
112
112
  set_is_closing( src )
113
113
  end
@@ -119,8 +119,7 @@ module P2p2
119
119
  # puts "debug2 heartbeat"
120
120
  add_tun_ctlmsg( pack_a_heartbeat )
121
121
  next_tick
122
- elsif now - @tun_info[ :created_at ] > EXPIRE_NEW
123
- # no tund addr
122
+ elsif now - @tun_info[ :peer_at ] > EXPIRE_NEW
124
123
  puts "#{ Time.new } expire new tun"
125
124
  set_is_closing( @tun )
126
125
  next_tick
@@ -249,7 +248,8 @@ module P2p2
249
248
  caches: [], # 块读出缓存 [ src_id, pack_id, data ]
250
249
  chunks: [], # 块队列 filename
251
250
  spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
252
- peer_addr: nil, # 对面地址
251
+ peer_addr: nil, # 配对地址
252
+ peer_at: nil, # 收到配对地址时间
253
253
  tund_addr: nil, # 连通后的tund地址
254
254
  src_exts: {}, # src额外信息 src_id => {}
255
255
  src_ids: {}, # dst_port => src_id
@@ -263,7 +263,7 @@ module P2p2
263
263
  @tun = tun
264
264
  @tun_info = tun_info
265
265
  add_read( tun, :tun )
266
- add_tun_ctlmsg( @room, @p2pd_addr )
266
+ add_tun_ctlmsg( [ '2', @room ].join, @p2pd_addr )
267
267
  end
268
268
 
269
269
  ##
@@ -402,6 +402,23 @@ module P2p2
402
402
  end
403
403
  end
404
404
 
405
+ ##
406
+ # send data
407
+ #
408
+ def send_data( tun, data, to_addr )
409
+ begin
410
+ tun.sendmsg( data, 0, to_addr )
411
+ rescue IO::WaitWritable, Errno::EINTR
412
+ return false
413
+ rescue Errno::EHOSTUNREACH, Errno::ENETUNREACH, Errno::ENETDOWN => e
414
+ puts "#{ Time.new } #{ e.class }, close tun"
415
+ close_tun( tun )
416
+ return false
417
+ end
418
+
419
+ true
420
+ end
421
+
405
422
  ##
406
423
  # close src
407
424
  #
@@ -503,15 +520,14 @@ module P2p2
503
520
  #
504
521
  def write_src( src )
505
522
  src_info = @src_infos[ src ]
506
- data = src_info[ :cache ]
507
- from = :cache
523
+ from, data = :cache, src_info[ :cache ]
508
524
 
509
525
  if data.empty?
510
526
  if src_info[ :chunks ].any?
511
527
  path = File.join( @src_chunk_dir, src_info[ :chunks ].shift )
512
528
 
513
529
  begin
514
- src_info[ :cache ] = data = IO.binread( path )
530
+ data = src_info[ :cache ] = IO.binread( path )
515
531
  File.delete( path )
516
532
  rescue Errno::ENOENT => e
517
533
  puts "#{ Time.new } read #{ path } #{ e.class }"
@@ -519,8 +535,7 @@ module P2p2
519
535
  return
520
536
  end
521
537
  else
522
- data = src_info[ :wbuff ]
523
- from = :wbuff
538
+ from, data = :wbuff, src_info[ :wbuff ]
524
539
  end
525
540
  end
526
541
 
@@ -546,6 +561,7 @@ module P2p2
546
561
  # puts "debug2 write src #{ written }"
547
562
  data = data[ written..-1 ]
548
563
  src_info[ from ] = data
564
+ src_info[ :last_continue_at ] = Time.new
549
565
  end
550
566
 
551
567
  ##
@@ -557,13 +573,13 @@ module P2p2
557
573
  return
558
574
  end
559
575
 
576
+ now = Time.new
577
+
560
578
  # 传ctlmsg
561
579
  while @tun_info[ :ctlmsgs ].any?
562
580
  to_addr, data = @tun_info[ :ctlmsgs ].first
563
581
 
564
- begin
565
- tun.sendmsg( data, 0, to_addr )
566
- rescue IO::WaitWritable, Errno::EINTR
582
+ unless send_data( tun, data, to_addr )
567
583
  return
568
584
  end
569
585
 
@@ -579,16 +595,15 @@ module P2p2
579
595
  data = src_ext[ :wmems ][ pack_id ]
580
596
 
581
597
  if data
582
- begin
583
- tun.sendmsg( data, 0, @tun_info[ :tund_addr ] )
584
- rescue IO::WaitWritable, Errno::EINTR
598
+ unless send_data( tun, data, @tun_info[ :tund_addr ] )
585
599
  return
586
600
  end
601
+
602
+ src_ext[ :last_continue_at ] = now
587
603
  end
588
604
  end
589
605
 
590
606
  @tun_info[ :resendings ].shift
591
- return
592
607
  end
593
608
 
594
609
  # 若写后达到上限,暂停取写前
@@ -604,8 +619,7 @@ module P2p2
604
619
 
605
620
  # 取写前
606
621
  if @tun_info[ :caches ].any?
607
- src_id, pack_id, data = @tun_info[ :caches ].first
608
- from = :caches
622
+ datas = @tun_info[ :caches ]
609
623
  elsif @tun_info[ :chunks ].any?
610
624
  path = File.join( @tun_chunk_dir, @tun_info[ :chunks ].shift )
611
625
 
@@ -626,42 +640,39 @@ module P2p2
626
640
  data = data[ ( 18 + pack_size )..-1 ]
627
641
  end
628
642
 
629
- @tun_info[ :caches ] = caches
630
- src_id, pack_id, data = caches.first
631
- from = :caches
643
+ datas = @tun_info[ :caches ] = caches
632
644
  elsif @tun_info[ :wbuffs ].any?
633
- src_id, pack_id, data = @tun_info[ :wbuffs ].first
634
- from = :wbuffs
645
+ datas = @tun_info[ :wbuffs ]
635
646
  else
636
647
  @writes.delete( tun )
637
648
  return
638
649
  end
639
650
 
640
- src_ext = @tun_info[ :src_exts ][ src_id ]
651
+ while datas.any?
652
+ src_id, pack_id, data = datas.first
653
+ src_ext = @tun_info[ :src_exts ][ src_id ]
641
654
 
642
- if src_ext
643
- if pack_id <= CONFUSE_UNTIL
644
- data = @custom.encode( data )
645
- # puts "debug1 encoded pack #{ pack_id }"
646
- end
655
+ if src_ext
656
+ if pack_id <= CONFUSE_UNTIL
657
+ data = @custom.encode( data )
658
+ # puts "debug1 encoded pack #{ pack_id }"
659
+ end
647
660
 
648
- data = [ [ pack_id, src_id ].pack( 'Q>Q>' ), data ].join
661
+ data = [ [ pack_id, src_id ].pack( 'Q>Q>' ), data ].join
649
662
 
650
- begin
651
- tun.sendmsg( data, 0, @tun_info[ :tund_addr ] )
652
- rescue IO::WaitWritable, Errno::EINTR
653
- return
663
+ unless send_data( tun, data, @tun_info[ :tund_addr ] )
664
+ return
665
+ end
666
+
667
+ # puts "debug2 written pack #{ pack_id }"
668
+ src_ext[ :relay_pack_id ] = pack_id
669
+ src_ext[ :wmems ][ pack_id ] = data
670
+ src_ext[ :send_ats ][ pack_id ] = now
671
+ src_ext[ :last_continue_at ] = now
654
672
  end
655
673
 
656
- # puts "debug2 written pack #{ pack_id }"
657
- now = Time.new
658
- src_ext[ :relay_pack_id ] = pack_id
659
- src_ext[ :wmems ][ pack_id ] = data
660
- src_ext[ :send_ats ][ pack_id ] = now
661
- src_ext[ :last_continue_at ] = now
674
+ datas.shift
662
675
  end
663
-
664
- @tun_info[ from ].shift
665
676
  end
666
677
 
667
678
  ##
@@ -685,16 +696,15 @@ module P2p2
685
696
  # puts "debug1 accept a src #{ addrinfo.inspect } #{ id }"
686
697
 
687
698
  @src_infos[ src ] = {
688
- id: id, # id
689
- biggest_pack_id: 0, # 最大包号码
690
- rbuffs: [], # p1端dst未准备好,暂存流量 [ pack_id, data ]
691
- wbuff: '', # 写前
692
- cache: '', # 块读出缓存
693
- chunks: [], # 块队列,写前达到块大小时结一个块 filename
694
- spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
695
- created_at: Time.new, # 创建时间
696
- last_recv_at: nil, # 上一次收到流量的时间,过期关闭
697
- is_closing: false # 是否准备关闭
699
+ id: id, # id
700
+ biggest_pack_id: 0, # 最大包号码
701
+ rbuffs: [], # p1端dst未准备好,暂存流量 [ pack_id, data ]
702
+ wbuff: '', # 写前
703
+ cache: '', # 块读出缓存
704
+ chunks: [], # 块队列,写前达到块大小时结一个块 filename
705
+ spring: 0, # 块后缀,结块时,如果块队列不为空,则自增,为空,则置为0
706
+ last_continue_at: Time.new, # 上一次发生流量的时间
707
+ is_closing: false # 是否准备关闭
698
708
  }
699
709
 
700
710
  add_read( src, :src )
@@ -714,7 +724,7 @@ module P2p2
714
724
  is_dst_closed: false, # dst是否已关闭
715
725
  biggest_dst_pack_id: 0, # dst最大包号码
716
726
  completed_pack_id: 0, # 完成到几(对面收到几)
717
- last_continue_at: Time.new # 创建,或者上一次收到连续流量,或者发出新包的时间
727
+ last_continue_at: Time.new # 上一次发生流量的时间
718
728
  }
719
729
 
720
730
  @tun_info[ :src_exts ][ id ] = src_ext
@@ -738,7 +748,7 @@ module P2p2
738
748
 
739
749
  # puts "debug2 read src #{ data.inspect }"
740
750
  src_info = @src_infos[ src ]
741
- src_info[ :last_recv_at ] = Time.new
751
+ src_info[ :last_continue_at ] = Time.new
742
752
  src_id = src_info[ :id ]
743
753
  src_ext = @tun_info[ :src_exts ][ src_id ]
744
754
 
@@ -784,6 +794,7 @@ module P2p2
784
794
  puts "#{ Time.new } got peer addr #{ Addrinfo.new( peer_addr ).inspect }"
785
795
 
786
796
  @tun_info[ :peer_addr ] = peer_addr
797
+ @tun_info[ :peer_at ] = now
787
798
  loop_punch_peer
788
799
  when HEARTBEAT
789
800
  from_addr = addrinfo.to_sockaddr
@@ -5,7 +5,7 @@ require 'p2p2/version'
5
5
  require 'socket'
6
6
 
7
7
  ##
8
- # P2p2::P2pd - 内网里的任意应用,访问另一个内网里的应用服务端。配对服务器端。
8
+ # P2p2::P2pd - 配对服务。
9
9
  #
10
10
  # 包结构
11
11
  # ======
@@ -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
- unless File.exist?( room_path )
39
- puts "#{ Time.new } create #{ room_path } #{ addrinfo.inspect }"
40
- write_room( room_path, from_addr )
41
- return
42
- end
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
- if ( addrinfo.ip_address == op_addrinfo.ip_address ) || ( addrinfo.ip_port == op_addrinfo.ip_port )
54
- write_room( room_path, from_addr )
55
- else
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 )
@@ -1,3 +1,3 @@
1
1
  module P2p2
2
- VERSION = '0.21.0'.freeze
2
+ VERSION = '0.26.0'.freeze
3
3
  end
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ["qqtakafan@gmail.com"]
11
11
 
12
12
  spec.summary = %q{p2p}
13
- spec.description = %q{内网里的任意应用,访问另一个内网里的应用服务端。}
13
+ spec.description = %q{p2p通道。nat穿透。}
14
14
  spec.homepage = "https://github.com/takafan/p2p2"
15
15
  spec.license = "MIT"
16
16
 
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p2p2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.21.0
4
+ version: 0.26.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-03 00:00:00.000000000 Z
11
+ date: 2020-08-29 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 内网里的任意应用,访问另一个内网里的应用服务端。
13
+ description: p2p通道。nat穿透。
14
14
  email:
15
15
  - qqtakafan@gmail.com
16
16
  executables: []
@@ -49,8 +49,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
49
49
  - !ruby/object:Gem::Version
50
50
  version: '0'
51
51
  requirements: []
52
- rubyforge_project:
53
- rubygems_version: 2.7.6.2
52
+ rubygems_version: 3.1.2
54
53
  signing_key:
55
54
  specification_version: 4
56
55
  summary: p2p