p2p2 0.8.0 → 0.8.1

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.
@@ -1,135 +1,135 @@
1
- require 'p2p2/head'
2
- require 'p2p2/version'
3
- require 'socket'
4
-
5
- ##
6
- # P2p2::P2pd - 内网里的任意应用,访问另一个内网里的应用服务端。配对服务器端。
7
- #
8
- # 1.
9
- #
10
- # ```
11
- # p2pd
12
- # ^ ^
13
- # ^ ^
14
- # “周立波的房间” “周立波的房间”
15
- # ^ ^
16
- # ^ ^
17
- # p1 --> nat --><-- nat <-- p2
18
- #
19
- # ```
20
- #
21
- # 2.
22
- #
23
- # ```
24
- # ssh --> p2 --> (encode) --> p1 --> (decode) --> sshd
25
- # ```
26
- #
27
- # usage
28
- # =====
29
- #
30
- # 1. Girl::P2pd.new( 5050 ).looping # @server
31
- #
32
- # 2. Girl::P1.new( 'your.server.ip', 5050, '127.0.0.1', 22, '周立波' ).looping # @home1
33
- #
34
- # 3. Girl::P2.new( 'your.server.ip', 5050, '0.0.0.0', 2222, '周立波' ).looping # @home2
35
- #
36
- # 4. ssh -p2222 libo@localhost
37
- #
38
- # 包结构
39
- # ======
40
- #
41
- # Q>: 1+ app/shadow_id -> Q>: pack_id -> traffic
42
- # 0 ctlmsg -> C: 1 peer addr -> p1/p2_sockaddr
43
- # 2 heartbeat -> C: random char
44
- # 3 a new app -> Q>: app_id
45
- # 4 paired -> Q>Q>: app_id shadow_id
46
- # 5 shadow status -> Q>Q>Q>: shadow_id biggest_shadow_pack_id continue_app_pack_id
47
- # 6 app status -> Q>Q>Q>: app_id biggest_app_pack_id continue_shadow_pack_id
48
- # 7 miss -> Q>Q>Q>: app/shadow_id pack_id_begin pack_id_end
49
- # 8 fin1 -> Q>: app/shadow_id
50
- # 9 got fin1 -> Q>: app/shadow_id
51
- # 10 fin2 -> Q>: app/shadow_id
52
- # 11 got fin2 -> Q>: app/shadow_id
53
- # 12 p1 fin
54
- # 13 p2 fin
55
- #
56
- module P2p2
57
- class P2pd
58
-
59
- ##
60
- # p2pd_port 配对服务器端口
61
- # p2pd_dir 可在该目录下看到所有的房间
62
- def initialize( p2pd_port = 5050, p2pd_dir = '/tmp' )
63
- p2pd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
64
- p2pd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
65
- p2pd.bind( Socket.pack_sockaddr_in( p2pd_port, '0.0.0.0' ) )
66
-
67
- @p2pd = p2pd
68
- @p2pd_dir = p2pd_dir
69
- end
70
-
71
- def looping
72
- puts 'looping'
73
-
74
- loop do
75
- rs, _ = IO.select( [ @p2pd ] )
76
- read_p2pd( rs.first )
77
- end
78
- rescue Interrupt => e
79
- puts e.class
80
- quit!
81
- end
82
-
83
- def quit!
84
- exit
85
- end
86
-
87
- private
88
-
89
- def read_p2pd( p2pd )
90
- data, addrinfo, rflags, *controls = p2pd.recvmsg
91
- return if data.size > 255
92
-
93
- sockaddr = addrinfo.to_sockaddr
94
- title_path = File.join( @p2pd_dir, data )
95
-
96
- unless File.exist?( title_path )
97
- write_title( title_path, sockaddr )
98
- return
99
- end
100
-
101
- if Time.new - File.mtime( title_path ) > 300
102
- write_title( title_path, sockaddr )
103
- return
104
- end
105
-
106
- op_sockaddr = IO.binread( title_path )
107
-
108
- if Addrinfo.new( op_sockaddr ).ip_address == addrinfo.ip_address
109
- write_title( title_path, sockaddr )
110
- return
111
- end
112
-
113
- send_pack( p2pd, "#{ [ 0, PEER_ADDR ].pack( 'Q>C' ) }#{ op_sockaddr }", sockaddr )
114
- send_pack( p2pd, "#{ [ 0, PEER_ADDR ].pack( 'Q>C' ) }#{ sockaddr }", op_sockaddr )
115
- end
116
-
117
- def write_title( title_path, sockaddr )
118
- begin
119
- # puts "debug write title #{ title_path } #{ Time.new }"
120
- IO.binwrite( title_path, sockaddr )
121
- rescue Errno::ENOENT, ArgumentError => e
122
- puts "binwrite #{ e.class } #{ Time.new }"
123
- end
124
- end
125
-
126
- def send_pack( sock, data, target_sockaddr )
127
- begin
128
- # puts "debug sendmsg #{ data.inspect } #{ Time.new }"
129
- sock.sendmsg( data, 0, target_sockaddr )
130
- rescue IO::WaitWritable, Errno::EINTR => e
131
- puts "sendmsg #{ e.class } #{ Time.new }"
132
- end
133
- end
134
- end
135
- end
1
+ require 'p2p2/head'
2
+ require 'p2p2/version'
3
+ require 'socket'
4
+
5
+ ##
6
+ # P2p2::P2pd - 内网里的任意应用,访问另一个内网里的应用服务端。配对服务器端。
7
+ #
8
+ # 1.
9
+ #
10
+ # ```
11
+ # p2pd
12
+ # ^ ^
13
+ # ^ ^
14
+ # “周立波的房间” “周立波的房间”
15
+ # ^ ^
16
+ # ^ ^
17
+ # p1 --> nat --><-- nat <-- p2
18
+ #
19
+ # ```
20
+ #
21
+ # 2.
22
+ #
23
+ # ```
24
+ # ssh --> p2 --> (encode) --> p1 --> (decode) --> sshd
25
+ # ```
26
+ #
27
+ # usage
28
+ # =====
29
+ #
30
+ # 1. Girl::P2pd.new( 5050 ).looping # @server
31
+ #
32
+ # 2. Girl::P1.new( 'your.server.ip', 5050, '127.0.0.1', 22, '周立波' ).looping # @home1
33
+ #
34
+ # 3. Girl::P2.new( 'your.server.ip', 5050, '0.0.0.0', 2222, '周立波' ).looping # @home2
35
+ #
36
+ # 4. ssh -p2222 libo@localhost
37
+ #
38
+ # 包结构
39
+ # ======
40
+ #
41
+ # Q>: 1+ app/shadow_id -> Q>: pack_id -> traffic
42
+ # 0 ctlmsg -> C: 1 peer addr -> p1/p2_sockaddr
43
+ # 2 heartbeat -> C: random char
44
+ # 3 a new app -> Q>: app_id
45
+ # 4 paired -> Q>Q>: app_id shadow_id
46
+ # 5 shadow status -> Q>Q>Q>: shadow_id biggest_shadow_pack_id continue_app_pack_id
47
+ # 6 app status -> Q>Q>Q>: app_id biggest_app_pack_id continue_shadow_pack_id
48
+ # 7 miss -> Q>Q>Q>: app/shadow_id pack_id_begin pack_id_end
49
+ # 8 fin1 -> Q>: app/shadow_id
50
+ # 9 got fin1 -> Q>: app/shadow_id
51
+ # 10 fin2 -> Q>: app/shadow_id
52
+ # 11 got fin2 -> Q>: app/shadow_id
53
+ # 12 p1 fin
54
+ # 13 p2 fin
55
+ #
56
+ module P2p2
57
+ class P2pd
58
+
59
+ ##
60
+ # p2pd_port 配对服务器端口
61
+ # p2pd_dir 可在该目录下看到所有的房间
62
+ def initialize( p2pd_port = 5050, p2pd_dir = '/tmp' )
63
+ p2pd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 )
64
+ p2pd.setsockopt( Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1 )
65
+ p2pd.bind( Socket.pack_sockaddr_in( p2pd_port, '0.0.0.0' ) )
66
+
67
+ @p2pd = p2pd
68
+ @p2pd_dir = p2pd_dir
69
+ end
70
+
71
+ def looping
72
+ puts 'looping'
73
+
74
+ loop do
75
+ rs, _ = IO.select( [ @p2pd ] )
76
+ read_p2pd( rs.first )
77
+ end
78
+ rescue Interrupt => e
79
+ puts e.class
80
+ quit!
81
+ end
82
+
83
+ def quit!
84
+ exit
85
+ end
86
+
87
+ private
88
+
89
+ def read_p2pd( p2pd )
90
+ data, addrinfo, rflags, *controls = p2pd.recvmsg
91
+ return if data.size > 255
92
+
93
+ sockaddr = addrinfo.to_sockaddr
94
+ title_path = File.join( @p2pd_dir, data )
95
+
96
+ unless File.exist?( title_path )
97
+ write_title( title_path, sockaddr )
98
+ return
99
+ end
100
+
101
+ if Time.new - File.mtime( title_path ) > 300
102
+ write_title( title_path, sockaddr )
103
+ return
104
+ end
105
+
106
+ op_sockaddr = IO.binread( title_path )
107
+
108
+ if Addrinfo.new( op_sockaddr ).ip_address == addrinfo.ip_address
109
+ write_title( title_path, sockaddr )
110
+ return
111
+ end
112
+
113
+ send_pack( p2pd, "#{ [ 0, PEER_ADDR ].pack( 'Q>C' ) }#{ op_sockaddr }", sockaddr )
114
+ send_pack( p2pd, "#{ [ 0, PEER_ADDR ].pack( 'Q>C' ) }#{ sockaddr }", op_sockaddr )
115
+ end
116
+
117
+ def write_title( title_path, sockaddr )
118
+ begin
119
+ # puts "debug write title #{ title_path } #{ Time.new }"
120
+ IO.binwrite( title_path, sockaddr )
121
+ rescue Errno::ENOENT, ArgumentError => e
122
+ puts "binwrite #{ e.class } #{ Time.new }"
123
+ end
124
+ end
125
+
126
+ def send_pack( sock, data, target_sockaddr )
127
+ begin
128
+ # puts "debug sendmsg #{ data.inspect } #{ Time.new }"
129
+ sock.sendmsg( data, 0, target_sockaddr )
130
+ rescue IO::WaitWritable, Errno::EINTR => e
131
+ puts "sendmsg #{ e.class } #{ Time.new }"
132
+ end
133
+ end
134
+ end
135
+ end
@@ -1,3 +1,3 @@
1
- module P2p2
2
- VERSION = "0.8.0"
3
- end
1
+ module P2p2
2
+ VERSION = "0.8.1"
3
+ end
@@ -1,29 +1,29 @@
1
-
2
- lib = File.expand_path("../lib", __FILE__)
3
- $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require "p2p2/version"
5
-
6
- Gem::Specification.new do |spec|
7
- spec.name = "p2p2"
8
- spec.version = P2p2::VERSION
9
- spec.authors = ["takafan"]
10
- spec.email = ["qqtakafan@gmail.com"]
11
-
12
- spec.summary = %q{p2p}
13
- spec.description = %q{内网里的任意应用,访问另一个内网里的应用服务端。}
14
- spec.homepage = "https://github.com/takafan/p2p2"
15
- spec.license = "MIT"
16
-
17
- spec.files = %w[
18
- p2p2.gemspec
19
- lib/p2p2.rb
20
- lib/p2p2/head.rb
21
- lib/p2p2/hex.rb
22
- lib/p2p2/p1.rb
23
- lib/p2p2/p2.rb
24
- lib/p2p2/p2pd.rb
25
- lib/p2p2/version.rb
26
- ]
27
-
28
- spec.require_paths = ["lib"]
29
- end
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "p2p2/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "p2p2"
8
+ spec.version = P2p2::VERSION
9
+ spec.authors = ["takafan"]
10
+ spec.email = ["qqtakafan@gmail.com"]
11
+
12
+ spec.summary = %q{p2p}
13
+ spec.description = %q{内网里的任意应用,访问另一个内网里的应用服务端。}
14
+ spec.homepage = "https://github.com/takafan/p2p2"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = %w[
18
+ p2p2.gemspec
19
+ lib/p2p2.rb
20
+ lib/p2p2/head.rb
21
+ lib/p2p2/hex.rb
22
+ lib/p2p2/p1.rb
23
+ lib/p2p2/p2.rb
24
+ lib/p2p2/p2pd.rb
25
+ lib/p2p2/version.rb
26
+ ]
27
+
28
+ spec.require_paths = ["lib"]
29
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: p2p2
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.8.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - takafan
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-08-25 00:00:00.000000000 Z
11
+ date: 2019-08-26 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: 内网里的任意应用,访问另一个内网里的应用服务端。
14
14
  email:
@@ -44,8 +44,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
44
44
  - !ruby/object:Gem::Version
45
45
  version: '0'
46
46
  requirements: []
47
- rubyforge_project:
48
- rubygems_version: 2.7.6
47
+ rubygems_version: 3.0.4
49
48
  signing_key:
50
49
  specification_version: 4
51
50
  summary: p2p