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
|