p2p2 0.21.0 → 0.26.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: 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