firescan 0.07

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.
Files changed (77) hide show
  1. data/LICENSE.txt +202 -0
  2. data/README.txt +37 -0
  3. data/USAGE.txt +43 -0
  4. data/VERSION.txt +4 -0
  5. data/bin/firescan +4 -0
  6. data/build +7 -0
  7. data/doc/Example.html +224 -0
  8. data/doc/Firebind.html +213 -0
  9. data/doc/Firebind/Client.html +750 -0
  10. data/doc/Firebind/Portspec.html +390 -0
  11. data/doc/Firebind/Scan.html +413 -0
  12. data/doc/Firebind/ScanError.html +277 -0
  13. data/doc/Firebind/ScanState.html +1015 -0
  14. data/doc/Firebind/SimpleProtocol.html +292 -0
  15. data/doc/Firebind/TcpTransport.html +481 -0
  16. data/doc/Firebind/Transport.html +275 -0
  17. data/doc/Firebind/UdpTransport.html +472 -0
  18. data/doc/LICENSE_txt.html +323 -0
  19. data/doc/README_txt.html +171 -0
  20. data/doc/Runner.html +166 -0
  21. data/doc/TestPortspec.html +289 -0
  22. data/doc/Tools.html +321 -0
  23. data/doc/USAGE_txt.html +184 -0
  24. data/doc/VERSION_txt.html +126 -0
  25. data/doc/build.html +125 -0
  26. data/doc/created.rid +22 -0
  27. data/doc/doc/created_rid.html +121 -0
  28. data/doc/firescan_gemspec.html +140 -0
  29. data/doc/images/add.png +0 -0
  30. data/doc/images/arrow_up.png +0 -0
  31. data/doc/images/brick.png +0 -0
  32. data/doc/images/brick_link.png +0 -0
  33. data/doc/images/bug.png +0 -0
  34. data/doc/images/bullet_black.png +0 -0
  35. data/doc/images/bullet_toggle_minus.png +0 -0
  36. data/doc/images/bullet_toggle_plus.png +0 -0
  37. data/doc/images/date.png +0 -0
  38. data/doc/images/delete.png +0 -0
  39. data/doc/images/find.png +0 -0
  40. data/doc/images/loadingAnimation.gif +0 -0
  41. data/doc/images/macFFBgHack.png +0 -0
  42. data/doc/images/package.png +0 -0
  43. data/doc/images/page_green.png +0 -0
  44. data/doc/images/page_white_text.png +0 -0
  45. data/doc/images/page_white_width.png +0 -0
  46. data/doc/images/plugin.png +0 -0
  47. data/doc/images/ruby.png +0 -0
  48. data/doc/images/tag_blue.png +0 -0
  49. data/doc/images/tag_green.png +0 -0
  50. data/doc/images/transparent.png +0 -0
  51. data/doc/images/wrench.png +0 -0
  52. data/doc/images/wrench_orange.png +0 -0
  53. data/doc/images/zoom.png +0 -0
  54. data/doc/index.html +118 -0
  55. data/doc/js/darkfish.js +155 -0
  56. data/doc/js/jquery.js +18 -0
  57. data/doc/js/navigation.js +142 -0
  58. data/doc/js/search.js +94 -0
  59. data/doc/js/search_index.js +1 -0
  60. data/doc/js/searcher.js +228 -0
  61. data/doc/rdoc.css +595 -0
  62. data/doc/table_of_contents.html +230 -0
  63. data/firescan.gemspec +18 -0
  64. data/lib/example.rb +20 -0
  65. data/lib/firebind/client.rb +308 -0
  66. data/lib/firebind/portspec.rb +107 -0
  67. data/lib/firebind/scan.rb +288 -0
  68. data/lib/firebind/scan_error.rb +32 -0
  69. data/lib/firebind/scan_state.rb +140 -0
  70. data/lib/firebind/simple_protocol.rb +59 -0
  71. data/lib/firebind/tcp_transport.rb +184 -0
  72. data/lib/firebind/tools.rb +107 -0
  73. data/lib/firebind/transport.rb +44 -0
  74. data/lib/firebind/udp_transport.rb +174 -0
  75. data/test/portspec_test.rb +53 -0
  76. data/test/runner.rb +7 -0
  77. metadata +136 -0
@@ -0,0 +1,275 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class Firebind::Transport - RDoc Documentation</title>
8
+
9
+ <link type="text/css" media="screen" href="../rdoc.css" rel="stylesheet">
10
+
11
+ <script type="text/javascript">
12
+ var rdoc_rel_prefix = "../";
13
+ </script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
16
+ <script type="text/javascript" charset="utf-8" src="../js/navigation.js"></script>
17
+ <script type="text/javascript" charset="utf-8" src="../js/search_index.js"></script>
18
+ <script type="text/javascript" charset="utf-8" src="../js/search.js"></script>
19
+ <script type="text/javascript" charset="utf-8" src="../js/searcher.js"></script>
20
+ <script type="text/javascript" charset="utf-8" src="../js/darkfish.js"></script>
21
+
22
+
23
+ <body id="top" class="class">
24
+ <nav id="metadata">
25
+ <nav id="home-section" class="section">
26
+ <h3 class="section-header">
27
+ <a href="../index.html">Home</a>
28
+ <a href="../table_of_contents.html#classes">Classes</a>
29
+ <a href="../table_of_contents.html#methods">Methods</a>
30
+ </h3>
31
+ </nav>
32
+
33
+
34
+ <nav id="search-section" class="section project-section" class="initially-hidden">
35
+ <form action="#" method="get" accept-charset="utf-8">
36
+ <h3 class="section-header">
37
+ <input type="text" name="search" placeholder="Search" id="search-field"
38
+ title="Type to search, Up and Down to navigate, Enter to load">
39
+ </h3>
40
+ </form>
41
+
42
+ <ul id="search-results" class="initially-hidden"></ul>
43
+ </nav>
44
+
45
+
46
+
47
+
48
+ <div id="file-metadata">
49
+ <nav id="file-list-section" class="section">
50
+ <h3 class="section-header">Defined In</h3>
51
+ <ul>
52
+ <li>lib/firebind/transport.rb
53
+ </ul>
54
+ </nav>
55
+
56
+
57
+ </div>
58
+
59
+ <div id="class-metadata">
60
+
61
+ <nav id="parent-class-section" class="section">
62
+ <h3 class="section-header">Parent</h3>
63
+
64
+ <p class="link">Object
65
+
66
+ </nav>
67
+
68
+ <!-- Included Modules -->
69
+ <nav id="includes-section" class="section">
70
+ <h3 class="section-header">Included Modules</h3>
71
+
72
+ <ul class="link-list">
73
+
74
+
75
+ <li><a class="include" href="../Tools.html">Tools</a>
76
+
77
+
78
+ </ul>
79
+ </nav>
80
+
81
+
82
+ <!-- Method Quickref -->
83
+ <nav id="method-list-section" class="section">
84
+ <h3 class="section-header">Methods</h3>
85
+
86
+ <ul class="link-list">
87
+
88
+ <li ><a href="#method-c-new">::new</a>
89
+
90
+ <li ><a href="#method-i-close">#close</a>
91
+
92
+ </ul>
93
+ </nav>
94
+
95
+ </div>
96
+
97
+ <div id="project-metadata">
98
+ <nav id="fileindex-section" class="section project-section">
99
+ <h3 class="section-header">Pages</h3>
100
+
101
+ <ul>
102
+
103
+ <li class="file"><a href="../LICENSE_txt.html">LICENSE</a>
104
+
105
+ <li class="file"><a href="../README_txt.html">README</a>
106
+
107
+ <li class="file"><a href="../USAGE_txt.html">USAGE</a>
108
+
109
+ <li class="file"><a href="../VERSION_txt.html">VERSION</a>
110
+
111
+ <li class="file"><a href="../build.html">build</a>
112
+
113
+ <li class="file"><a href="../doc/created_rid.html">created.rid</a>
114
+
115
+ <li class="file"><a href="../firescan_gemspec.html">firescan.gemspec</a>
116
+
117
+ </ul>
118
+ </nav>
119
+
120
+ <nav id="classindex-section" class="section project-section">
121
+ <h3 class="section-header">Class and Module Index</h3>
122
+
123
+ <ul class="link-list">
124
+
125
+ <li><a href="../Example.html">Example</a>
126
+
127
+ <li><a href="../Firebind.html">Firebind</a>
128
+
129
+ <li><a href="../Firebind/Client.html">Firebind::Client</a>
130
+
131
+ <li><a href="../Firebind/Portspec.html">Firebind::Portspec</a>
132
+
133
+ <li><a href="../Firebind/Scan.html">Firebind::Scan</a>
134
+
135
+ <li><a href="../Firebind/ScanError.html">Firebind::ScanError</a>
136
+
137
+ <li><a href="../Firebind/ScanState.html">Firebind::ScanState</a>
138
+
139
+ <li><a href="../Firebind/SimpleProtocol.html">Firebind::SimpleProtocol</a>
140
+
141
+ <li><a href="../Firebind/TcpTransport.html">Firebind::TcpTransport</a>
142
+
143
+ <li><a href="../Firebind/Transport.html">Firebind::Transport</a>
144
+
145
+ <li><a href="../Firebind/UdpTransport.html">Firebind::UdpTransport</a>
146
+
147
+ <li><a href="../Runner.html">Runner</a>
148
+
149
+ <li><a href="../TestPortspec.html">TestPortspec</a>
150
+
151
+ <li><a href="../Tools.html">Tools</a>
152
+
153
+ </ul>
154
+ </nav>
155
+
156
+ </div>
157
+ </nav>
158
+
159
+ <div id="documentation">
160
+ <h1 class="class">class Firebind::Transport</h1>
161
+
162
+ <div id="description" class="description">
163
+
164
+ </div><!-- description -->
165
+
166
+
167
+
168
+
169
+ <section id="5Buntitled-5D" class="documentation-section">
170
+
171
+
172
+
173
+
174
+
175
+
176
+
177
+
178
+ <!-- Methods -->
179
+
180
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
181
+ <h3 class="section-header">Public Class Methods</h3>
182
+
183
+
184
+ <div id="method-c-new" class="method-detail ">
185
+
186
+ <div class="method-heading">
187
+ <span class="method-name">new</span><span
188
+ class="method-args">(echo_server, timeout)</span>
189
+
190
+ <span class="method-click-advice">click to toggle source</span>
191
+
192
+ </div>
193
+
194
+
195
+ <div class="method-description">
196
+
197
+
198
+
199
+
200
+
201
+
202
+ <div class="method-source-code" id="new-source">
203
+ <pre><span class="ruby-comment"># File lib/firebind/transport.rb, line 27</span>
204
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span> (<span class="ruby-identifier">echo_server</span>, <span class="ruby-identifier">timeout</span>)
205
+ <span class="ruby-ivar">@echo_server</span> = <span class="ruby-identifier">echo_server</span>
206
+ <span class="ruby-ivar">@timeout</span> = <span class="ruby-identifier">timeout</span>
207
+ <span class="ruby-ivar">@timeout_seconds</span> = <span class="ruby-identifier">timeout</span>.<span class="ruby-identifier">to_f</span><span class="ruby-operator">/</span><span class="ruby-value">1000</span>
208
+ <span class="ruby-keyword">end</span></pre>
209
+ </div><!-- new-source -->
210
+
211
+ </div>
212
+
213
+
214
+
215
+
216
+ </div><!-- new-method -->
217
+
218
+
219
+ </section><!-- public-class-method-details -->
220
+
221
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
222
+ <h3 class="section-header">Public Instance Methods</h3>
223
+
224
+
225
+ <div id="method-i-close" class="method-detail ">
226
+
227
+ <div class="method-heading">
228
+ <span class="method-name">close</span><span
229
+ class="method-args">()</span>
230
+
231
+ <span class="method-click-advice">click to toggle source</span>
232
+
233
+ </div>
234
+
235
+
236
+ <div class="method-description">
237
+
238
+
239
+
240
+
241
+
242
+
243
+ <div class="method-source-code" id="close-source">
244
+ <pre><span class="ruby-comment"># File lib/firebind/transport.rb, line 34</span>
245
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">close</span>
246
+ <span class="ruby-keyword">begin</span>
247
+ <span class="ruby-comment">#noinspection RubyResolve</span>
248
+ <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">close</span>
249
+ <span class="ruby-keyword">rescue</span>
250
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;error closing socket #{$!}&quot;</span>
251
+ <span class="ruby-keyword">end</span>
252
+ <span class="ruby-keyword">end</span></pre>
253
+ </div><!-- close-source -->
254
+
255
+ </div>
256
+
257
+
258
+
259
+
260
+ </div><!-- close-method -->
261
+
262
+
263
+ </section><!-- public-instance-method-details -->
264
+
265
+ </section><!-- 5Buntitled-5D -->
266
+
267
+ </div><!-- documentation -->
268
+
269
+
270
+ <footer id="validator-badges">
271
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
272
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 4.0.1.
273
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
274
+ </footer>
275
+
@@ -0,0 +1,472 @@
1
+ <!DOCTYPE html>
2
+
3
+ <html>
4
+ <head>
5
+ <meta content="text/html; charset=UTF-8" http-equiv="Content-Type">
6
+
7
+ <title>class Firebind::UdpTransport - RDoc Documentation</title>
8
+
9
+ <link type="text/css" media="screen" href="../rdoc.css" rel="stylesheet">
10
+
11
+ <script type="text/javascript">
12
+ var rdoc_rel_prefix = "../";
13
+ </script>
14
+
15
+ <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
16
+ <script type="text/javascript" charset="utf-8" src="../js/navigation.js"></script>
17
+ <script type="text/javascript" charset="utf-8" src="../js/search_index.js"></script>
18
+ <script type="text/javascript" charset="utf-8" src="../js/search.js"></script>
19
+ <script type="text/javascript" charset="utf-8" src="../js/searcher.js"></script>
20
+ <script type="text/javascript" charset="utf-8" src="../js/darkfish.js"></script>
21
+
22
+
23
+ <body id="top" class="class">
24
+ <nav id="metadata">
25
+ <nav id="home-section" class="section">
26
+ <h3 class="section-header">
27
+ <a href="../index.html">Home</a>
28
+ <a href="../table_of_contents.html#classes">Classes</a>
29
+ <a href="../table_of_contents.html#methods">Methods</a>
30
+ </h3>
31
+ </nav>
32
+
33
+
34
+ <nav id="search-section" class="section project-section" class="initially-hidden">
35
+ <form action="#" method="get" accept-charset="utf-8">
36
+ <h3 class="section-header">
37
+ <input type="text" name="search" placeholder="Search" id="search-field"
38
+ title="Type to search, Up and Down to navigate, Enter to load">
39
+ </h3>
40
+ </form>
41
+
42
+ <ul id="search-results" class="initially-hidden"></ul>
43
+ </nav>
44
+
45
+
46
+
47
+
48
+ <div id="file-metadata">
49
+ <nav id="file-list-section" class="section">
50
+ <h3 class="section-header">Defined In</h3>
51
+ <ul>
52
+ <li>lib/firebind/udp_transport.rb
53
+ </ul>
54
+ </nav>
55
+
56
+
57
+ </div>
58
+
59
+ <div id="class-metadata">
60
+
61
+ <nav id="parent-class-section" class="section">
62
+ <h3 class="section-header">Parent</h3>
63
+
64
+ <p class="link"><a href="Transport.html">Firebind::Transport</a>
65
+
66
+ </nav>
67
+
68
+ <!-- Included Modules -->
69
+ <nav id="includes-section" class="section">
70
+ <h3 class="section-header">Included Modules</h3>
71
+
72
+ <ul class="link-list">
73
+
74
+
75
+ <li><a class="include" href="../Tools.html">Tools</a>
76
+
77
+
78
+ </ul>
79
+ </nav>
80
+
81
+
82
+ <!-- Method Quickref -->
83
+ <nav id="method-list-section" class="section">
84
+ <h3 class="section-header">Methods</h3>
85
+
86
+ <ul class="link-list">
87
+
88
+ <li class="calls-super" ><a href="#method-c-new">::new</a>
89
+
90
+ <li ><a href="#method-i-connect">#connect</a>
91
+
92
+ <li ><a href="#method-i-receive">#receive</a>
93
+
94
+ <li ><a href="#method-i-send">#send</a>
95
+
96
+ </ul>
97
+ </nav>
98
+
99
+ </div>
100
+
101
+ <div id="project-metadata">
102
+ <nav id="fileindex-section" class="section project-section">
103
+ <h3 class="section-header">Pages</h3>
104
+
105
+ <ul>
106
+
107
+ <li class="file"><a href="../LICENSE_txt.html">LICENSE</a>
108
+
109
+ <li class="file"><a href="../README_txt.html">README</a>
110
+
111
+ <li class="file"><a href="../USAGE_txt.html">USAGE</a>
112
+
113
+ <li class="file"><a href="../VERSION_txt.html">VERSION</a>
114
+
115
+ <li class="file"><a href="../build.html">build</a>
116
+
117
+ <li class="file"><a href="../doc/created_rid.html">created.rid</a>
118
+
119
+ <li class="file"><a href="../firescan_gemspec.html">firescan.gemspec</a>
120
+
121
+ </ul>
122
+ </nav>
123
+
124
+ <nav id="classindex-section" class="section project-section">
125
+ <h3 class="section-header">Class and Module Index</h3>
126
+
127
+ <ul class="link-list">
128
+
129
+ <li><a href="../Example.html">Example</a>
130
+
131
+ <li><a href="../Firebind.html">Firebind</a>
132
+
133
+ <li><a href="../Firebind/Client.html">Firebind::Client</a>
134
+
135
+ <li><a href="../Firebind/Portspec.html">Firebind::Portspec</a>
136
+
137
+ <li><a href="../Firebind/Scan.html">Firebind::Scan</a>
138
+
139
+ <li><a href="../Firebind/ScanError.html">Firebind::ScanError</a>
140
+
141
+ <li><a href="../Firebind/ScanState.html">Firebind::ScanState</a>
142
+
143
+ <li><a href="../Firebind/SimpleProtocol.html">Firebind::SimpleProtocol</a>
144
+
145
+ <li><a href="../Firebind/TcpTransport.html">Firebind::TcpTransport</a>
146
+
147
+ <li><a href="../Firebind/Transport.html">Firebind::Transport</a>
148
+
149
+ <li><a href="../Firebind/UdpTransport.html">Firebind::UdpTransport</a>
150
+
151
+ <li><a href="../Runner.html">Runner</a>
152
+
153
+ <li><a href="../TestPortspec.html">TestPortspec</a>
154
+
155
+ <li><a href="../Tools.html">Tools</a>
156
+
157
+ </ul>
158
+ </nav>
159
+
160
+ </div>
161
+ </nav>
162
+
163
+ <div id="documentation">
164
+ <h1 class="class">class Firebind::UdpTransport</h1>
165
+
166
+ <div id="description" class="description">
167
+
168
+ <p>Send and receive echo using UDP transport.</p>
169
+
170
+ </div><!-- description -->
171
+
172
+
173
+
174
+
175
+ <section id="5Buntitled-5D" class="documentation-section">
176
+
177
+
178
+
179
+
180
+
181
+
182
+
183
+
184
+ <!-- Methods -->
185
+
186
+ <section id="public-class-5Buntitled-5D-method-details" class="method-section section">
187
+ <h3 class="section-header">Public Class Methods</h3>
188
+
189
+
190
+ <div id="method-c-new" class="method-detail ">
191
+
192
+ <div class="method-heading">
193
+ <span class="method-name">new</span><span
194
+ class="method-args">(echo_server,timeout)</span>
195
+
196
+ <span class="method-click-advice">click to toggle source</span>
197
+
198
+ </div>
199
+
200
+
201
+ <div class="method-description">
202
+
203
+
204
+
205
+
206
+ <div class="method-calls-super">
207
+ Calls superclass method
208
+ <a href="Transport.html#method-c-new">Firebind::Transport.new</a>
209
+ </div>
210
+
211
+
212
+
213
+ <div class="method-source-code" id="new-source">
214
+ <pre><span class="ruby-comment"># File lib/firebind/udp_transport.rb, line 26</span>
215
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">initialize</span> (<span class="ruby-identifier">echo_server</span>,<span class="ruby-identifier">timeout</span>)
216
+ <span class="ruby-keyword">super</span>(<span class="ruby-identifier">echo_server</span>,<span class="ruby-identifier">timeout</span>)
217
+ <span class="ruby-keyword">end</span></pre>
218
+ </div><!-- new-source -->
219
+
220
+ </div>
221
+
222
+
223
+
224
+
225
+ </div><!-- new-method -->
226
+
227
+
228
+ </section><!-- public-class-method-details -->
229
+
230
+ <section id="public-instance-5Buntitled-5D-method-details" class="method-section section">
231
+ <h3 class="section-header">Public Instance Methods</h3>
232
+
233
+
234
+ <div id="method-i-connect" class="method-detail ">
235
+
236
+ <div class="method-heading">
237
+ <span class="method-name">connect</span><span
238
+ class="method-args">(port)</span>
239
+
240
+ <span class="method-click-advice">click to toggle source</span>
241
+
242
+ </div>
243
+
244
+
245
+ <div class="method-description">
246
+
247
+
248
+
249
+
250
+
251
+
252
+ <div class="method-source-code" id="connect-source">
253
+ <pre><span class="ruby-comment"># File lib/firebind/udp_transport.rb, line 30</span>
254
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">connect</span>(<span class="ruby-identifier">port</span>)
255
+ <span class="ruby-ivar">@port</span> = <span class="ruby-identifier">port</span>
256
+ <span class="ruby-keyword">begin</span>
257
+ <span class="ruby-ivar">@socket</span> = <span class="ruby-constant">Socket</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:INET</span>,<span class="ruby-value">:DGRAM</span>)
258
+ <span class="ruby-ivar">@remote_addr</span> = <span class="ruby-constant">Socket</span>.<span class="ruby-identifier">pack_sockaddr_in</span>(<span class="ruby-ivar">@port</span>, <span class="ruby-ivar">@echo_server</span>)
259
+ <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">connect_nonblock</span> <span class="ruby-ivar">@remote_addr</span>
260
+ <span class="ruby-keyword">rescue</span>
261
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span> <span class="ruby-value">:FAILURE_ON_PAYLOAD_SEND</span>
262
+ <span class="ruby-keyword">end</span>
263
+ <span class="ruby-keyword">end</span></pre>
264
+ </div><!-- connect-source -->
265
+
266
+ </div>
267
+
268
+
269
+
270
+
271
+ </div><!-- connect-method -->
272
+
273
+
274
+ <div id="method-i-receive" class="method-detail ">
275
+
276
+ <div class="method-heading">
277
+ <span class="method-name">receive</span><span
278
+ class="method-args">()</span>
279
+
280
+ <span class="method-click-advice">click to toggle source</span>
281
+
282
+ </div>
283
+
284
+
285
+ <div class="method-description">
286
+
287
+ <p>Receive echo response from server. Partway through the timeout we’ll call
288
+ send() again to send more datagrams as a last ditch effort to get data
289
+ across.</p>
290
+
291
+ <p>PAYLOAD_REFUSED_ON_RECV PAYLOAD_ERROR_ON_RECV PAYLOAD_TIMED_OUT_ON_RECV</p>
292
+
293
+
294
+
295
+
296
+ <div class="method-source-code" id="receive-source">
297
+ <pre><span class="ruby-comment"># File lib/firebind/udp_transport.rb, line 101</span>
298
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">receive</span>
299
+ <span class="ruby-identifier">size</span> = <span class="ruby-ivar">@payload</span>.<span class="ruby-identifier">length</span>
300
+ <span class="ruby-identifier">count</span> = <span class="ruby-value">0</span>
301
+ <span class="ruby-identifier">receive_start</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
302
+ <span class="ruby-identifier">receive_buffer</span> = <span class="ruby-string">''</span>
303
+ <span class="ruby-identifier">halfway</span> = <span class="ruby-ivar">@timeout_seconds</span><span class="ruby-operator">/</span><span class="ruby-value">2</span>
304
+
305
+ <span class="ruby-keyword">while</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">receive_start</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-ivar">@timeout_seconds</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">size</span>
306
+
307
+ <span class="ruby-keyword">begin</span>
308
+ <span class="ruby-identifier">read_result</span> = <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">read_nonblock</span>(<span class="ruby-value">1024</span>)
309
+ <span class="ruby-identifier">count</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">read_result</span>.<span class="ruby-identifier">length</span> <span class="ruby-comment"># because appending to receive_buffer won't count recv bytes via .length</span>
310
+ <span class="ruby-comment"># add read_result to our buffer</span>
311
+ <span class="ruby-identifier">receive_buffer</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">read_result</span>
312
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;read buffer is #{count}&quot;</span>
313
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">IO</span><span class="ruby-operator">::</span><span class="ruby-constant">WaitReadable</span>
314
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">size</span>
315
+ <span class="ruby-comment"># we're done - read all we had expected to receive</span>
316
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;completed full read of #{count} bytes&quot;</span>
317
+ <span class="ruby-keyword">break</span>
318
+ <span class="ruby-keyword">elsif</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">receive_start</span> <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@timeout_seconds</span>
319
+ <span class="ruby-comment"># timeout on receive</span>
320
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:PAYLOAD_TIMED_OUT_ON_RECV</span>)
321
+ <span class="ruby-keyword">else</span>
322
+ <span class="ruby-comment"># send some more datagrams?</span>
323
+ <span class="ruby-keyword">if</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">receive_start</span> <span class="ruby-operator">&gt;</span> <span class="ruby-identifier">halfway</span>
324
+ <span class="ruby-keyword">begin</span>
325
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;halfway through timeout sending more datagrams on port #{@port}&quot;</span>
326
+ <span class="ruby-identifier">send</span>(<span class="ruby-ivar">@payload</span>,<span class="ruby-value">5</span>)
327
+ <span class="ruby-keyword">rescue</span>
328
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;mid-receive cycle resend resulted in #{$!} ignoring&quot;</span>
329
+ <span class="ruby-keyword">end</span>
330
+ <span class="ruby-keyword">end</span>
331
+
332
+ <span class="ruby-comment"># keep going</span>
333
+ <span class="ruby-constant">IO</span>.<span class="ruby-identifier">select</span>([<span class="ruby-ivar">@socket</span>],<span class="ruby-keyword">nil</span>,<span class="ruby-keyword">nil</span>,<span class="ruby-identifier">halfway</span>)
334
+ <span class="ruby-keyword">retry</span>
335
+ <span class="ruby-keyword">end</span>
336
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">EOFError</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">e</span>
337
+ <span class="ruby-comment"># connection was forcefully dropped or sent a final FIN ACK closing sequence</span>
338
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">size</span>
339
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:PAYLOAD_ERROR_ON_RECV</span>,<span class="ruby-identifier">e</span>)
340
+ <span class="ruby-keyword">end</span>
341
+
342
+ <span class="ruby-keyword">rescue</span>
343
+ <span class="ruby-comment">#collect all the ways a receive can fail... todo:</span>
344
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">$debug</span>
345
+ <span class="ruby-identifier">puts</span> <span class="ruby-string">'Caught unhandled socket error:'</span>
346
+ <span class="ruby-identifier">p</span> <span class="ruby-node">$1</span>
347
+ <span class="ruby-identifier">puts</span> <span class="ruby-identifier">$@</span>
348
+ <span class="ruby-keyword">end</span>
349
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:PAYLOAD_REFUSED_ON_RECV</span>,<span class="ruby-identifier">$!</span>)
350
+ <span class="ruby-keyword">end</span>
351
+
352
+ <span class="ruby-keyword">end</span>
353
+
354
+ <span class="ruby-comment"># we still could have timed out here, check rx buffer size first</span>
355
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">size</span>
356
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:PAYLOAD_TIMED_OUT_ON_RECV</span>)
357
+ <span class="ruby-keyword">end</span>
358
+
359
+ <span class="ruby-comment"># now compare what we received with what we sent</span>
360
+ <span class="ruby-identifier">received_array</span> = <span class="ruby-identifier">receive_buffer</span>.<span class="ruby-identifier">unpack</span>(<span class="ruby-string">'C*'</span>)
361
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">received_array</span> <span class="ruby-operator">!=</span> <span class="ruby-ivar">@payload</span>
362
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;rx buffer #{received_array.to_s} is NOT equal to expected #{@payload.to_s}&quot;</span>
363
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:PAYLOAD_MISMATCH_ON_RECV</span>)
364
+ <span class="ruby-keyword">else</span>
365
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;rx buffer #{received_array.to_s} is equal to payload #{@payload.to_s}&quot;</span>
366
+ <span class="ruby-keyword">end</span>
367
+
368
+ <span class="ruby-keyword">end</span></pre>
369
+ </div><!-- receive-source -->
370
+
371
+ </div>
372
+
373
+
374
+
375
+
376
+ </div><!-- receive-method -->
377
+
378
+
379
+ <div id="method-i-send" class="method-detail ">
380
+
381
+ <div class="method-heading">
382
+ <span class="method-name">send</span><span
383
+ class="method-args">(payload,num_payloads = 10)</span>
384
+
385
+ <span class="method-click-advice">click to toggle source</span>
386
+
387
+ </div>
388
+
389
+
390
+ <div class="method-description">
391
+
392
+ <p>Send data to the echo server, we’ll send multiple copies of the same data.
393
+ So long as the echo server receives one of these we should expect an echo
394
+ response.</p>
395
+
396
+ <p>@param [<a href="http://">Array</a> payload - array of bytes</p>
397
+
398
+
399
+
400
+
401
+ <div class="method-source-code" id="send-source">
402
+ <pre><span class="ruby-comment"># File lib/firebind/udp_transport.rb, line 45</span>
403
+ <span class="ruby-keyword">def</span> <span class="ruby-identifier">send</span>(<span class="ruby-identifier">payload</span>,<span class="ruby-identifier">num_payloads</span> = <span class="ruby-value">10</span>)
404
+ <span class="ruby-ivar">@payload</span> = <span class="ruby-identifier">payload</span>
405
+ <span class="ruby-identifier">size</span> = <span class="ruby-identifier">payload</span>.<span class="ruby-identifier">length</span>
406
+ <span class="ruby-identifier">count</span> = <span class="ruby-value">0</span>
407
+ <span class="ruby-identifier">send_start</span> = <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span>
408
+
409
+ <span class="ruby-comment"># send the payload this many times</span>
410
+ <span class="ruby-identifier">payloads_sent</span> = <span class="ruby-value">0</span>
411
+
412
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;sending buffer #{payload.to_s}&quot;</span>
413
+ <span class="ruby-comment">#payload.each do |byte|</span>
414
+ <span class="ruby-keyword">while</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">size</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">send_start</span> <span class="ruby-operator">&lt;</span> <span class="ruby-ivar">@timeout_seconds</span>
415
+ <span class="ruby-keyword">begin</span>
416
+
417
+ <span class="ruby-comment"># chomp up the payload depending upon where we left off</span>
418
+ <span class="ruby-identifier">send_buffer</span> = <span class="ruby-identifier">payload</span>[<span class="ruby-identifier">count</span>,<span class="ruby-identifier">size</span><span class="ruby-operator">-</span><span class="ruby-identifier">count</span>]
419
+
420
+ <span class="ruby-identifier">count</span> <span class="ruby-operator">+=</span> <span class="ruby-ivar">@socket</span>.<span class="ruby-identifier">write_nonblock</span> <span class="ruby-identifier">send_buffer</span>.<span class="ruby-identifier">pack</span>(<span class="ruby-string">'C*'</span>)
421
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;wrote #{count} bytes to #{@echo_server}:#{@port}&quot;</span>
422
+
423
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">payloads_sent</span> <span class="ruby-operator">&lt;</span> <span class="ruby-identifier">num_payloads</span> <span class="ruby-keyword">and</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">size</span>
424
+ <span class="ruby-comment"># reset counters to send another payload</span>
425
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;sending datagram number #{payloads_sent}&quot;</span>
426
+ <span class="ruby-identifier">count</span> = <span class="ruby-value">0</span>
427
+ <span class="ruby-identifier">payloads_sent</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
428
+ <span class="ruby-keyword">end</span>
429
+
430
+ <span class="ruby-keyword">rescue</span> <span class="ruby-constant">IO</span><span class="ruby-operator">::</span><span class="ruby-constant">WaitWritable</span>, <span class="ruby-constant">Errno</span><span class="ruby-operator">::</span><span class="ruby-constant">EINTR</span>
431
+
432
+ <span class="ruby-keyword">if</span> <span class="ruby-identifier">count</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">size</span>
433
+ <span class="ruby-comment"># we've written our payload, we're done</span>
434
+ <span class="ruby-identifier">debug</span> <span class="ruby-node">&quot;completed #{count} byte payload to #{@echo_server}:#{@port}&quot;</span>
435
+ <span class="ruby-keyword">elsif</span> <span class="ruby-constant">Time</span>.<span class="ruby-identifier">now</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">send_start</span> <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@timeout_seconds</span>
436
+ <span class="ruby-comment"># we've timed out of sending</span>
437
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span> <span class="ruby-value">:FAILURE_ON_PAYLOAD_SEND</span>
438
+ <span class="ruby-keyword">else</span>
439
+ <span class="ruby-comment"># try to write some more ? http://ruby-doc.org/core-1.9.3/IO.html#method-i-write_nonblock</span>
440
+ <span class="ruby-keyword">retry</span>
441
+ <span class="ruby-keyword">end</span>
442
+
443
+ <span class="ruby-keyword">rescue</span>
444
+ <span class="ruby-comment">#collect all the ways a send can fail...</span>
445
+ <span class="ruby-identifier">raise</span> <span class="ruby-constant">Firebind</span><span class="ruby-operator">::</span><span class="ruby-constant">ScanError</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:FAILURE_ON_PAYLOAD_SEND</span>, <span class="ruby-identifier">$!</span>)
446
+ <span class="ruby-keyword">end</span>
447
+
448
+ <span class="ruby-keyword">end</span>
449
+ <span class="ruby-keyword">end</span></pre>
450
+ </div><!-- send-source -->
451
+
452
+ </div>
453
+
454
+
455
+
456
+
457
+ </div><!-- send-method -->
458
+
459
+
460
+ </section><!-- public-instance-method-details -->
461
+
462
+ </section><!-- 5Buntitled-5D -->
463
+
464
+ </div><!-- documentation -->
465
+
466
+
467
+ <footer id="validator-badges">
468
+ <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
469
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 4.0.1.
470
+ <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
471
+ </footer>
472
+