minitcp 0.10.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5a5ea8ac3aaaa06e3051b9d4e696713132b1e721
4
+ data.tar.gz: 98eb5966f3ff14ca68c1522110b6fdd3d941b3d3
5
+ SHA512:
6
+ metadata.gz: 87f235759fc78198cbeeb0446b788c685f4c82ca79947fe551f0822da7c29e5fb7961e756eec422b524d92d2821688871caeaee01ac502d831d093aa598288f5
7
+ data.tar.gz: d217d33d86b4181190730605dfe88ccbfc3405eeb022521ae8fab0b32041a4ed57d7a199c73fc34fa7bf0836c9e3a3cbb36e99aad413e1d65bf1a89b665e95bf
data/CHANGELOG.txt ADDED
@@ -0,0 +1,42 @@
1
+ 0.10.0 : 2014-09-24 20:18:54 +0200
2
+ minitcp.rb : reveive_n_byte correction
3
+ 0.9.0 : 2014-09-18 22:38:31 +0200
4
+ 0.7.0 : 2014-09-18 22:37:45 +0200
5
+ README.md : titles
6
+ test.rb : UDP tests
7
+ minitcp.rb : udp creation
8
+ README.md : UDP creation
9
+ statcpu.rb : windows version, not finish...
10
+ README.md : spdy start demo
11
+ README.md : best code example
12
+ README.md : presentation
13
+ README.md : continious
14
+ 0.6.1
15
+ plot.rb : refactoring Measure.class
16
+ pingpongplot.rb : temporisation
17
+ 0.6.0 : 2014-08-21 11:06:44 +0200
18
+ README.md : todo
19
+ plot.rb : auto-scale
20
+ name_server.rb : creation
21
+ plot.rb : color
22
+ plot.rb : interaction with mouse
23
+ name_server.rb : forget debug
24
+ 0.5.0 : 2014-08-18 16:39:35 +0200
25
+ 0.4.0 : 2014-08-18 16:37:12 +0200
26
+ minitcp.rb : error on stdout for SocketReactive
27
+ README.md : typo
28
+ README.md : sockets presentation
29
+ README.md : rdoc url
30
+ minitcp.rb : comments
31
+ README.md : presentations, format
32
+ proxy.rb : prefix correction
33
+ README.md : proxy correction
34
+ README.md : todo, presentation
35
+ 0.3.0 : 2014-08-18 01:27:40 +0200
36
+ test.rb : sleep before thread good stoping detection
37
+ minitcp.rb : all read hendler do socket close when necessary
38
+ README.md : todo
39
+ 0.2.0 : 2014-08-17 16:07:03 +0200
40
+ Rakefile.rb : update
41
+ test.rb : license
42
+ proxy.rb : license
data/LICENSE ADDED
@@ -0,0 +1,2 @@
1
+
2
+ LGPL
data/README.md ADDED
@@ -0,0 +1,200 @@
1
+ Minitcp
2
+ ===
3
+
4
+ Presentation
5
+ ==
6
+
7
+ A little tool for doing some TCP/UDP sockets communications.
8
+
9
+ This tool have no pretention : it is not EventMachine ! :
10
+
11
+ * no mainloop,
12
+ * many threads are created/deleted.
13
+ * it is useful for send some data one-shot, test a ascii communication in few minutes...
14
+ * should be equivalent to netcat+bash ...
15
+
16
+
17
+ A TCP client :
18
+
19
+ ```ruby
20
+ MClient.run_one_shot("localhost",2200) do |socket|
21
+ socket.on_any_receive { |data| p "client recieved #{data.inspect}"}
22
+ 3.times { |j| socket.puts "Hello #{j}..." ; sleep(1) }
23
+ end.join
24
+ ```
25
+
26
+ An echo server :
27
+
28
+ ```ruby
29
+ srv=MServer.service(2200,"0.0.0.0",22) do |socket|
30
+ socket.on_any_receive { |data| socket.print(data) }
31
+ socket.on_timer(2000) do
32
+ socket.close
33
+ end
34
+ socket.wait_end
35
+ end
36
+ ```
37
+
38
+ A UDP server :
39
+
40
+ ```ruby
41
+ UDPAgent.on_datagramme("127.0.0.2",SRV_PORT ) { |data,from,p|
42
+ puts "Agent: received #{data} from #{from}:#{p}"
43
+ data && data.size>3 ? "OK-#{data}." : nil
44
+ }
45
+ ```
46
+
47
+ A UDP sender :
48
+
49
+ ```ruby
50
+ UDPAgent.on_timer(1000,
51
+ port: 2232,
52
+ on_timer: proc do
53
+ data=Time.now.to_i.to_s
54
+ puts "\n\n\non timer send <#{data}>"
55
+ {mess: data,host: "127.0.0.2",port: SRV_PORT}
56
+ end,
57
+ on_receive: proc { |data,from,sock|
58
+ puts "Client: received #{data} from #{from}"
59
+ UDPAgent.send_datagram_on_socket(sock,from.last,from[1],'ack')
60
+ }
61
+ )
62
+ ```
63
+
64
+
65
+ Docs: http://rubydoc.info/gems/minitcp
66
+
67
+
68
+ TCP
69
+ ===
70
+
71
+ Client
72
+ ---
73
+
74
+ ```
75
+ MClient.run_one_shot(host,port) do |socket| ... end
76
+ MClient.run_continious(host,port,time_inter_connection) do |socket| ... end
77
+ ```
78
+
79
+ Client socket is extended with all specifiques commandes (```SocketReactive```, see Sockets).
80
+
81
+ Server
82
+ ---
83
+
84
+ ```ruby
85
+ srv=MServer.service(port,"0.0.0.0",max_client) do |socket| ... end
86
+ ```
87
+ Mserver run a GServer.
88
+ Connected sockets are extended with same module as in client.
89
+
90
+ Sockets
91
+ ---
92
+
93
+ Handlers are disponibles for any sockets : client or server.
94
+ All handler's bloc run in distinct thread : so any handler-bloc can wait anything.
95
+ if socket is closed, handler/thread are cleanly (?) stoped.
96
+
97
+ * socket.**on_any_receive() {|data| ...}** : on receive some data, any size
98
+ * socket.**on_n_receive(sizemax=1) {|data| ...}** : receives n byte(s) only
99
+ * socket.**on_receive_sep(";") {|field | ... }** : reveive data until string separator
100
+ * socket.**on_timer(value_ms) { ... }** : each time do something, if socket is open
101
+ * socket.**after(duration) { ... }** : do something after n millisecondes, if socket is open
102
+
103
+ Some primitives are here for help (no thread):
104
+
105
+ * **received_timeout(sizemax,timeout)** : wait for n bytes, with timeout, (blocking caller),
106
+ * **wait_end()** : wait, (blocking caller) until socket is close. this
107
+ work only if something has closed the socket.this is possible unicly by receiving 0 bte on a
108
+ * **receive_n_bytes** / **on_receive_sep** : bocking version of handler,
109
+ * **connected?** : test if a close have been done,
110
+ * **data_readed()** : some receives (receive_sep...) can read more data form sockets,
111
+ this data are used by ```n_revieve/any_receive/receive_sep```, but they can be read/reseted
112
+ whith data_readed getseter.
113
+
114
+ This primitives are declared in SocketReactive module.
115
+
116
+ UDP
117
+ ===
118
+
119
+ 2 type of agents :
120
+
121
+ * **Server** : receive data from anywhere, can reply to sender
122
+ * **Timer** : emit to everybody, can receive response to them
123
+
124
+ 2 primitives :
125
+
126
+ * **send_datagram(host,port,message)** : create a socket, send mesage and close socket (ca'nt receive a reply)
127
+ * **send_datagram_on_socket(socket,host,port,message)** : use existant socket for send a message to ip:port
128
+
129
+
130
+ TODO
131
+ ==
132
+
133
+ * Serial line
134
+ * more socket primitive
135
+
136
+
137
+ Tests case
138
+ ==
139
+ A TCP proxy, debug tool (see samples/proxy.rb) :
140
+
141
+ ```ruby
142
+ MServer.service(2200,"0.0.0.0",22) do |scli|
143
+ px 2, "======== client Connected ========"
144
+ srv=MClient.run_one_shot("ip",2200) do |ssrv|
145
+ px 1, "======== server Connected ========"
146
+ ssrv.on_any_receive { |data| px 1,data; scli.print data }
147
+ scli.on_any_receive { |data| px 2,data; ssrv.print data}
148
+ ssrv.wait_end
149
+ scli.close rescue nil
150
+ end
151
+ scli.wait_end
152
+ srv.stop rescue nil
153
+ end
154
+ def px(sens,data)
155
+ data.each_line {|line| puts "#{(sens==1 ? "> " : "< ")}#{line.chomp}"
156
+ end
157
+
158
+ ```
159
+
160
+
161
+
162
+
163
+ Test serial **protocole-like** : header/body => ack/timeout:
164
+
165
+ * client send <length><data> , wait one char acquit or timeout
166
+ * serveur receive heade( size: 4 chars) , then data with size, send ack
167
+
168
+
169
+ ```ruby
170
+
171
+ srv=MServer.service(2200,"0.0.0.0",22) do |socket|
172
+ socket.on_n_receive(4) { |data|
173
+ size=data.to_i
174
+ data=socket.recv(size)
175
+ puts " Server recieved buffer : #{data.inspect}"
176
+ if rand(100)>50
177
+ socket.print("o")
178
+ else
179
+ puts " !!!non-ack by serv"
180
+ end
181
+ }
182
+ socket.on_timer(40*1000) { puts " serv close after 40 seconds"; socket.close }
183
+ socket.wait_end
184
+ end
185
+
186
+ MClient.run_one_shot("localhost",2200) do |socket|
187
+ 10.times { |j|
188
+ size=rand(1..10)
189
+ puts "Sending #{size} data..."
190
+ data='*'*size
191
+ socket.print "%04d" % size
192
+ socket.print data
193
+ p socket.received_timeout(1,100) ? "ack ok" : "!!! timeout ack"
194
+ }
195
+ p "end client"
196
+ end.join
197
+
198
+
199
+ ```
200
+
data/Rakefile.rb ADDED
@@ -0,0 +1,217 @@
1
+ # Creative Commons BY-SA : Regis d'Aubarede <regis.aubarede@gmail.com>
2
+ # LGPL
3
+ #################################################################
4
+ # Rakefile : git commit/add ; git push, test/spec & gem push
5
+ #################################################################
6
+ #
7
+ # Usage:
8
+ # > rake commit # commit in local directory and push to repository
9
+ # > rake gem # make gem,and test it, and push it to gemcutter
10
+ # > rake travis # travis CI run commands
11
+ #
12
+ #################################################################
13
+ # Requirements :
14
+ # version : X.Y.Z
15
+ # X : to be hand-modified
16
+ # Y : incremented at each 'rake gem'
17
+ # Z : increment on each file 'rake commit'
18
+ # auto commit all changed file, sking comment for each
19
+ # log all commment in CHANGELOG?Txt file
20
+ # increment VERSION content with version numbering rule
21
+ # so CHANGELOG.txt is updated with each comment/version change
22
+ # so VERSION is updated in each commit (Z part) and each gem build (Y part)
23
+ #
24
+ # commit:
25
+ # Use 'git status' output for each new/modified file,
26
+ # with asking some comment
27
+ # (no add/commit of comment is empty)
28
+ #
29
+ # gem:
30
+ # execute rspec if specs exists,
31
+ # make a gem, install it, execute samples/test.rb in it, if exist
32
+ # ask to operator if execution is ok and :
33
+ # increment version
34
+ # update change log/version
35
+ # do a 'gem push' and a 'gem yanked'
36
+ # make a coffe
37
+ #
38
+ #################################################################
39
+
40
+ FIGNORES=%w{VERSION CHANGELOG.txt .gitignore}
41
+ NAME= Dir.pwd.gsub(File.dirname(Dir.pwd)+'/',"")
42
+
43
+ Rake.application.options.trace = false
44
+
45
+ def push_changelog(line)
46
+ b=File.read('CHANGELOG.txt').split(/\r?\n/)
47
+ b.unshift(line)
48
+ File.open('CHANGELOG.txt','w') {|f| f.write(b[0..500].join("\n")) }
49
+ end
50
+ def changelog_push_currrent_versions()
51
+ version=File.read('VERSION').strip
52
+ b=File.read('CHANGELOG.txt').split(/\r?\n/)
53
+ b.unshift(version)
54
+ File.open('CHANGELOG.txt','w') {|f| f.write(b.join("\n")) }
55
+ yield rescue p $!.to_s
56
+ b.shift
57
+ File.open('CHANGELOG.txt','w') {|f| f.write(b.join("\n")) }
58
+ end
59
+
60
+ def change_version()
61
+ a=File.read('VERSION').strip.split('.')[0..2]
62
+ yield(a)
63
+ version=a.join('.')
64
+ File.open('VERSION','w') {|f| f.write(version) }
65
+ version
66
+ end
67
+ def verification_file(fn)
68
+ return unless File.extname(fn)==".rb"
69
+ content=File.read(fn)[0..600]
70
+ unless content =~ /LGPL/
71
+ puts "\nFile #{fn} seem not contain licenses data LGPL\n"
72
+ exit(0)
73
+ end
74
+ end
75
+ #############################################################
76
+ # Comment each file add/modified ##
77
+ #############################################################
78
+
79
+
80
+ desc "commit file changed and created"
81
+ task :commit_status do
82
+ `git status -s`.split(/\r?\n/).each do |line|
83
+ words=line.split(/\s+/)
84
+ case line
85
+ when /^ M /
86
+ filename=words[2]
87
+ next if FIGNORES.include?(filename)
88
+ system("git","diff",filename)
89
+ print("Comment for change in #{filename} : ")
90
+ comment=$stdin.gets
91
+ if comment && comment.chomp.size>0
92
+ comment.chomp!
93
+ (puts "Abort!";exit!) if comment=~/^a(b(o(r(t)?)?)?)?$/
94
+ verification_file(filename)
95
+ sh "git commit #{filename} -m \"#{comment.strip}\"" rescue 1
96
+ push_changelog(" #{File.basename(filename)} : #{comment}")
97
+ $changed=true
98
+ end
99
+ when /^\?\?/
100
+ filename=words[1]
101
+ print("Comment for new file in #{filename} : ")
102
+ comment=$stdin.gets.chomp
103
+ (puts "Abort!";exit!) if comment=~/^a(b(o(r(t)?)?)?)?$/
104
+ if comment =~ /^y|o/i
105
+ verification_file(filename)
106
+ sh "git add #{filename}"
107
+ sh "git commit #{filename} -m \"creation\"" rescue 1
108
+ $changed=true
109
+ end
110
+ end
111
+ end
112
+ end
113
+
114
+
115
+ #############################################################
116
+ # before commit
117
+ #############################################################
118
+
119
+ desc "job before commit"
120
+ task :pre_commit do
121
+ sh "cls" if RUBY_PLATFORM =~ /(win32)|(mingw)/i
122
+ puts <<EEND2
123
+
124
+
125
+ --------------------------------------------------------------------
126
+ Commmit and push #{NAME}
127
+ --------------------------------------------------------------------
128
+ EEND2
129
+
130
+ #sh "giti"
131
+ $changed=false
132
+ end
133
+
134
+ #############################################################
135
+ # after commit
136
+ #############################################################
137
+ desc "job after local commit done: push to git repo"
138
+ task :post_commit do
139
+ if $changed
140
+ $version=change_version { |a| a[-1]=(a.last.to_i+1) }
141
+ sh "git commit VERSION -m update"
142
+ changelog_push_currrent_versions {
143
+ sh "git commit CHANGELOG.txt -m update"
144
+ sh "git push"
145
+ puts "\n\nNew version is #{$version}\n"
146
+ }
147
+ else
148
+ puts "no change!"
149
+ end
150
+ end
151
+
152
+ #############################################################
153
+ # commit
154
+ #############################################################
155
+ desc "commit local and then distant repo"
156
+ task :commit => [:pre_commit,"commit_status",:post_commit]
157
+
158
+
159
+ #############################################################
160
+ # gem build & push
161
+ #############################################################
162
+ desc "make a gem and push it to gemcutter"
163
+ task :gem do
164
+ $version=change_version { |a|
165
+ a[-2]=(a[-2].to_i+1)
166
+ a[-1]=0
167
+ }
168
+ puts "New version ==>> #{$version}"
169
+ l=FileList['*.gem']
170
+ l.each { |fn| rm fn }
171
+ gem_name="#{NAME}-#{$version}.gem"
172
+ push_changelog "#{$version} : #{Time.now}"
173
+ sh "gem build #{NAME}.gemspec"
174
+ Rake::Task["test"].execute if File.exists?("samples/test.rb")
175
+ sh "gem push #{gem_name}"
176
+ l.each { |fn|
177
+ ov=fn.split('-')[1].gsub('.gem',"")
178
+ sh "gem yank -v #{ov} #{NAME}"
179
+ }
180
+ end
181
+ #############################################################
182
+ # execute tests
183
+ #############################################################
184
+
185
+ desc "test the current version of the framework by installing the gem and run a test programme"
186
+ task :test do
187
+ if File.exists?("spec/test_all.rb")
188
+ system("rspec spec/test_all.rb")
189
+ end
190
+ if File.exists?("samples/test.rb")
191
+ cd ".."
192
+ mkdir "#{NAME}Test" unless File.exists?("#{NAME}Test")
193
+ nname="#{NAME}Test/test.rb"
194
+ content=File.read("#{NAME}/samples/test.rb").gsub(/require_relative/," require").gsub('../lib/','')
195
+ File.open(nname,"w") { |f| f.write(content) }
196
+ sh "gem install #{FileList["#{NAME}/#{NAME}*.gem"][-1]}"
197
+ ruby nname rescue nil
198
+ cd NAME
199
+ print "\n\nOk for diffusion ? "
200
+ rep=$stdin.gets
201
+ raise("aborted!") unless rep && rep =~ /^y|o|d/
202
+ end
203
+ end
204
+
205
+ #############################################################
206
+ # travis command
207
+ #############################################################
208
+
209
+ task :travis do
210
+ puts "Starting travis test..."
211
+ cmd="bundle exec rspec spec/test_all.rb"
212
+ system("export DISPLAY=:99.0 && #{cmd}")
213
+ #system(cmd)
214
+ raise "rspec failed!" unless $?.exitstatus == 0
215
+ end
216
+
217
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.10.0