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 +4 -4
- data/lib/p2p2/p1.rb +1 -1
- data/lib/p2p2/p1_worker.rb +61 -48
- data/lib/p2p2/p2.rb +1 -1
- data/lib/p2p2/p2_worker.rb +68 -57
- data/lib/p2p2/p2pd.rb +1 -1
- data/lib/p2p2/p2pd_worker.rb +15 -15
- data/lib/p2p2/version.rb +1 -1
- data/p2p2.gemspec +1 -1
- metadata +4 -5
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA256:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 8b794e3b18c3c83d28013dc743181bd0f72ff9dc1c692266f68d360ebcc3855b
         | 
| 4 | 
            +
              data.tar.gz: 99ff62c980d909c10d412f076d7aac4e81afe195a824c7fd36b6ac78b2c7e777
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: b6cf3c77031cf3f53d1f8f884daca762140f68ff40c2538618058a2ffa8747d8c722069e432c02b3165ee3451545c82cd43177ba38e80218459c91b5a37bd978
         | 
| 7 | 
            +
              data.tar.gz: 177432a07d6976627d629658dd8e61ac105d538225e43af30842fe05d4378abfd2be28d47b4c2616a0e733b80228a6badcf33f21c9464cfe5ff3ce78a0c16d2a
         | 
    
        data/lib/p2p2/p1.rb
    CHANGED
    
    
    
        data/lib/p2p2/p1_worker.rb
    CHANGED
    
    | @@ -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 | 
| 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  | 
| 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[ : | 
| 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 ] =  | 
| 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 | 
            -
                     | 
| 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 | 
            -
                         | 
| 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 | 
            -
                     | 
| 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 | 
            -
                     | 
| 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 | 
            -
                   | 
| 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 | 
            -
             | 
| 617 | 
            -
             | 
| 618 | 
            -
             | 
| 619 | 
            -
             | 
| 620 | 
            -
             | 
| 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 | 
            -
             | 
| 637 | 
            +
                      data = [ [ pack_id, dst_local_port ].pack( 'Q>n' ), data ].join
         | 
| 623 638 |  | 
| 624 | 
            -
             | 
| 625 | 
            -
             | 
| 626 | 
            -
             | 
| 627 | 
            -
             | 
| 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 | 
            -
                     | 
| 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[ : | 
| 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 | 
            -
                           | 
| 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 |  | 
    
        data/lib/p2p2/p2.rb
    CHANGED
    
    
    
        data/lib/p2p2/p2_worker.rb
    CHANGED
    
    | @@ -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 | 
| 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  | 
| 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[ : | 
| 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 ] =  | 
| 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 | 
            -
                     | 
| 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 | 
            -
                         | 
| 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 | 
            -
                     | 
| 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 | 
            -
                     | 
| 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 | 
            -
                   | 
| 651 | 
            +
                  while datas.any?
         | 
| 652 | 
            +
                    src_id, pack_id, data = datas.first
         | 
| 653 | 
            +
                    src_ext = @tun_info[ :src_exts ][ src_id ]
         | 
| 641 654 |  | 
| 642 | 
            -
             | 
| 643 | 
            -
             | 
| 644 | 
            -
             | 
| 645 | 
            -
             | 
| 646 | 
            -
             | 
| 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 | 
            -
             | 
| 661 | 
            +
                      data = [ [ pack_id, src_id ].pack( 'Q>Q>' ), data ].join
         | 
| 649 662 |  | 
| 650 | 
            -
             | 
| 651 | 
            -
             | 
| 652 | 
            -
             | 
| 653 | 
            -
             | 
| 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 | 
            -
                     | 
| 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, | 
| 689 | 
            -
                    biggest_pack_id: 0, | 
| 690 | 
            -
                    rbuffs: [], | 
| 691 | 
            -
                    wbuff: '', | 
| 692 | 
            -
                    cache: '', | 
| 693 | 
            -
                    chunks: [], | 
| 694 | 
            -
                    spring: 0, | 
| 695 | 
            -
                     | 
| 696 | 
            -
                     | 
| 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[ : | 
| 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
         | 
    
        data/lib/p2p2/p2pd.rb
    CHANGED
    
    
    
        data/lib/p2p2/p2pd_worker.rb
    CHANGED
    
    | @@ -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 | 
            -
                   | 
| 39 | 
            -
                     | 
| 40 | 
            -
             | 
| 41 | 
            -
                     | 
| 42 | 
            -
                   | 
| 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 | 
            -
                   | 
| 54 | 
            -
             | 
| 55 | 
            -
                   | 
| 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 )
         | 
    
        data/lib/p2p2/version.rb
    CHANGED
    
    
    
        data/p2p2.gemspec
    CHANGED
    
    | @@ -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. | 
| 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- | 
| 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 | 
            -
             | 
| 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
         |