ionian 0.6.4 → 0.6.5
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/doc/Ionian/Extension/IO.html +44 -48
- data/doc/Ionian/Extension/Socket.html +462 -170
- data/doc/Ionian/Extension.html +4 -4
- data/doc/Ionian/Server.html +4 -4
- data/doc/Ionian/Socket.html +321 -103
- data/doc/Ionian.html +4 -4
- data/doc/_index.html +5 -5
- data/doc/css/style.css +1 -0
- data/doc/file.README.html +4 -4
- data/doc/file.license.html +4 -4
- data/doc/frames.html +1 -1
- data/doc/index.html +4 -4
- data/doc/method_list.html +81 -39
- data/doc/top-level-namespace.html +4 -4
- data/lib/ionian/extension/io.rb +22 -24
- data/lib/ionian/extension/socket.rb +52 -14
- data/lib/ionian/socket.rb +27 -17
- metadata +2 -2
@@ -14,7 +14,7 @@ module Ionian
|
|
14
14
|
module Socket
|
15
15
|
|
16
16
|
# Called automaticallly when the object is extended with #extend.
|
17
|
-
def self.extended
|
17
|
+
def self.extended obj
|
18
18
|
obj.extend Ionian::Extension::IO
|
19
19
|
obj.initialize_ionian_socket
|
20
20
|
end
|
@@ -24,6 +24,44 @@ module Ionian
|
|
24
24
|
def initialize_ionian_socket
|
25
25
|
end
|
26
26
|
|
27
|
+
# Returns true if sending broadcast datagrams is permitted.
|
28
|
+
# ( SO_BROADCAST )
|
29
|
+
def broadcast
|
30
|
+
param = self.getsockopt(::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST)
|
31
|
+
.data.unpack('i').first
|
32
|
+
param > 0 ? true : false
|
33
|
+
end
|
34
|
+
|
35
|
+
# Permit sending broadcast datagrams if true.
|
36
|
+
# ( SO_BROADCAST )
|
37
|
+
def broadcast= value
|
38
|
+
param = value ? 1 : 0
|
39
|
+
self.setsockopt ::Socket::SOL_SOCKET, ::Socket::SO_BROADCAST, [param].pack('i')
|
40
|
+
end
|
41
|
+
|
42
|
+
alias_method :broadcast?, :broadcast
|
43
|
+
|
44
|
+
# For connection-oriented protocols, prevent #close from returning
|
45
|
+
# immediately and try to deliver any data in the send buffer if value
|
46
|
+
# is true.
|
47
|
+
# ( SO_LINGER )
|
48
|
+
def linger
|
49
|
+
param = self.getsockopt(::Socket::SOL_SOCKET, ::Socket::SO_LINGER)
|
50
|
+
.data.unpack('i').first
|
51
|
+
param > 0 ? true : false
|
52
|
+
end
|
53
|
+
|
54
|
+
# For connection-oriented protocols, prevent #close from returning
|
55
|
+
# immediately and try to deliver any data in the send buffer if value
|
56
|
+
# is true.
|
57
|
+
# ( SO_LINGER )
|
58
|
+
def linger= value
|
59
|
+
param = value ? 1 : 0
|
60
|
+
self.setsockopt ::Socket::SOL_SOCKET, ::Socket::SO_LINGER, [param].pack('i')
|
61
|
+
end
|
62
|
+
|
63
|
+
alias_method :linger?, :linger
|
64
|
+
|
27
65
|
# Returns true if local address reuse is allowed.
|
28
66
|
# ( SO_REUSEADDR )
|
29
67
|
def reuse_addr
|
@@ -36,7 +74,7 @@ module Ionian
|
|
36
74
|
|
37
75
|
# Allows local address reuse if true.
|
38
76
|
# ( SO_REUSEADDR )
|
39
|
-
def reuse_addr=
|
77
|
+
def reuse_addr= value
|
40
78
|
param = value ? 1 : 0
|
41
79
|
self.setsockopt ::Socket::SOL_SOCKET, ::Socket::SO_REUSEADDR, [param].pack('i')
|
42
80
|
end
|
@@ -52,7 +90,7 @@ module Ionian
|
|
52
90
|
|
53
91
|
# Sets the time to live (hop limit).
|
54
92
|
# ( IP_TTL )
|
55
|
-
def ttl=
|
93
|
+
def ttl= value
|
56
94
|
self.setsockopt ::Socket::IPPROTO_IP, ::Socket::IP_TTL, [value].pack('i')
|
57
95
|
end
|
58
96
|
|
@@ -68,7 +106,7 @@ module Ionian
|
|
68
106
|
|
69
107
|
# Disables the Nagle algorithm if true.
|
70
108
|
# ( TCP_NODELAY )
|
71
|
-
def no_delay=
|
109
|
+
def no_delay= value
|
72
110
|
param = value ? 1 : 0
|
73
111
|
self.setsockopt ::Socket::IPPROTO_TCP, ::Socket::TCP_NODELAY, [param].pack('i')
|
74
112
|
end
|
@@ -93,7 +131,7 @@ module Ionian
|
|
93
131
|
# See #recork.
|
94
132
|
# Linux only.
|
95
133
|
# ( TCP_CORK )
|
96
|
-
def cork=
|
134
|
+
def cork= value
|
97
135
|
param = value ? 1 : 0
|
98
136
|
self.setsockopt ::Socket::IPPROTO_TCP, ::Socket::TCP_CORK, [param].pack('i')
|
99
137
|
end
|
@@ -111,7 +149,7 @@ module Ionian
|
|
111
149
|
# Interface is the local network interface to receive the
|
112
150
|
# multicast traffic on (all interfaces if not specified).
|
113
151
|
# ( IP_ADD_MEMBERSHIP )
|
114
|
-
def ip_add_membership
|
152
|
+
def ip_add_membership address = nil, interface = nil
|
115
153
|
address ||= self.remote_address.ip_address
|
116
154
|
interface ||= '0.0.0.0'
|
117
155
|
|
@@ -127,7 +165,7 @@ module Ionian
|
|
127
165
|
# Interface is the local network interface the multicast
|
128
166
|
# traffic is received on (all interfaces if not specified).
|
129
167
|
# ( IP_DROP_MEMBERSHIP )
|
130
|
-
def ip_drop_membership
|
168
|
+
def ip_drop_membership address = nil, interface = nil
|
131
169
|
address ||= self.remote_address.ip_address
|
132
170
|
interface ||= '0.0.0.0'
|
133
171
|
|
@@ -146,7 +184,7 @@ module Ionian
|
|
146
184
|
|
147
185
|
# Specify default interface for outgoing multicasts.
|
148
186
|
# ( IP_MULTICAST_IF )
|
149
|
-
def ip_multicast_if=
|
187
|
+
def ip_multicast_if= interface = nil
|
150
188
|
interface ||= '0.0.0.0'
|
151
189
|
|
152
190
|
self.setsockopt \
|
@@ -164,7 +202,7 @@ module Ionian
|
|
164
202
|
|
165
203
|
# Set the time to live (hop limit) for outgoing multicasts.
|
166
204
|
# ( IP_MULTICAST_TTL )
|
167
|
-
def ip_multicast_ttl=
|
205
|
+
def ip_multicast_ttl= value
|
168
206
|
self.setsockopt ::Socket::IPPROTO_IP, ::Socket::IP_MULTICAST_TTL, [value].pack('C')
|
169
207
|
end
|
170
208
|
|
@@ -180,7 +218,7 @@ module Ionian
|
|
180
218
|
|
181
219
|
# Enables loopback of outgoing multicasts if true.
|
182
220
|
# ( IP_MULTICAST_LOOP )
|
183
|
-
def ip_multicast_loop=
|
221
|
+
def ip_multicast_loop= value
|
184
222
|
param = value ? 1 : 0
|
185
223
|
self.setsockopt ::Socket::IPPROTO_IP, ::Socket::IP_MULTICAST_LOOP, [param].pack('C')
|
186
224
|
end
|
@@ -204,7 +242,7 @@ module Ionian
|
|
204
242
|
end
|
205
243
|
|
206
244
|
# Not yet implemented.
|
207
|
-
def ipv6_multicast_if=
|
245
|
+
def ipv6_multicast_if= value
|
208
246
|
# TODO: Implement
|
209
247
|
end
|
210
248
|
|
@@ -215,7 +253,7 @@ module Ionian
|
|
215
253
|
end
|
216
254
|
|
217
255
|
# Not yet implemented.
|
218
|
-
def ipv6_multicast_hops=
|
256
|
+
def ipv6_multicast_hops= value
|
219
257
|
# TODO: Implement
|
220
258
|
end
|
221
259
|
|
@@ -228,14 +266,14 @@ module Ionian
|
|
228
266
|
alias_method :ipv6_multicast_loop?, :ipv6_multicast_loop
|
229
267
|
|
230
268
|
# Not yet implemented.
|
231
|
-
def ipv6_multicast_loop=
|
269
|
+
def ipv6_multicast_loop= value
|
232
270
|
# TODO: Implement
|
233
271
|
end
|
234
272
|
|
235
273
|
|
236
274
|
class << self
|
237
275
|
# Returns true if the given address is within the multicast range.
|
238
|
-
def multicast
|
276
|
+
def multicast address
|
239
277
|
address >= '224.0.0.0' and address <= '239.255.255.255' ? true : false
|
240
278
|
end
|
241
279
|
|
data/lib/ionian/socket.rb
CHANGED
@@ -5,6 +5,15 @@ module Ionian
|
|
5
5
|
# A convenient wrapper for TCP, UDP, and Unix client sockets.
|
6
6
|
class Socket
|
7
7
|
|
8
|
+
# IP address or URL of server.
|
9
|
+
attr_reader :host
|
10
|
+
|
11
|
+
# Remote port number.
|
12
|
+
attr_reader :port
|
13
|
+
|
14
|
+
# Local port number.
|
15
|
+
attr_reader :bind_port
|
16
|
+
|
8
17
|
# Creates a new socket or wraps an existing socket.
|
9
18
|
#
|
10
19
|
# Args:
|
@@ -22,7 +31,7 @@ module Ionian
|
|
22
31
|
# cork: Set true to enable the TCP_CORK flag. Buffers multiple writes
|
23
32
|
# into one segment.
|
24
33
|
# expression: Overrides the #read_match regular expression for received data.
|
25
|
-
def initialize
|
34
|
+
def initialize existing_socket = nil, **kwargs
|
26
35
|
@socket = existing_socket
|
27
36
|
|
28
37
|
@ionian_listeners = []
|
@@ -55,16 +64,17 @@ module Ionian
|
|
55
64
|
@socket.expression = @expression if @expression
|
56
65
|
|
57
66
|
initialize_socket_methods
|
67
|
+
|
58
68
|
else
|
59
69
|
# Initialize new socket.
|
60
70
|
|
61
|
-
#
|
62
|
-
|
71
|
+
# Parse host out of "host:port" if specified.
|
72
|
+
host_port_ary = kwargs.fetch(:host).to_s.split ':'
|
63
73
|
|
64
|
-
@host =
|
65
|
-
@port = kwargs.fetch :port,
|
74
|
+
@host = host_port_ary[0]
|
75
|
+
@port = kwargs.fetch :port, host_port_ary[1].to_i || 23
|
66
76
|
@bind_port = kwargs.fetch :bind_port, @port
|
67
|
-
|
77
|
+
|
68
78
|
# Automatically select UDP for the multicast range. Otherwise default to TCP.
|
69
79
|
default_protocol = :tcp
|
70
80
|
default_protocol = :udp if Ionian::Extension::Socket.multicast? @host
|
@@ -94,7 +104,7 @@ module Ionian
|
|
94
104
|
end
|
95
105
|
|
96
106
|
# Set the regular expression used to match incoming data.
|
97
|
-
def expression=
|
107
|
+
def expression= exp
|
98
108
|
@expression = exp
|
99
109
|
@socket.expression = exp if @socket
|
100
110
|
end
|
@@ -108,7 +118,7 @@ module Ionian
|
|
108
118
|
# Returns an array of received matches.
|
109
119
|
# Block yields received match.
|
110
120
|
# See Ionian::Extension::IO#read_match.
|
111
|
-
def cmd
|
121
|
+
def cmd string, **kwargs, &block
|
112
122
|
create_socket unless @persistent
|
113
123
|
|
114
124
|
if @protocol == :udp
|
@@ -119,7 +129,7 @@ module Ionian
|
|
119
129
|
|
120
130
|
@socket.flush
|
121
131
|
|
122
|
-
matches = @socket.read_match(kwargs) {|match| yield match if block_given?}
|
132
|
+
matches = @socket.read_match(kwargs) { |match| yield match if block_given? }
|
123
133
|
@socket.close unless @persistent
|
124
134
|
|
125
135
|
matches
|
@@ -138,8 +148,8 @@ module Ionian
|
|
138
148
|
alias_method :on_match, :register_observer
|
139
149
|
|
140
150
|
# Unregister a block from being called when matched data is received.
|
141
|
-
def unregister_observer
|
142
|
-
@ionian_listeners.delete_if {|o| o == block}
|
151
|
+
def unregister_observer &block
|
152
|
+
@ionian_listeners.delete_if { |o| o == block }
|
143
153
|
@socket.unregister_observer &block if @socket
|
144
154
|
block
|
145
155
|
end
|
@@ -150,7 +160,7 @@ module Ionian
|
|
150
160
|
# Args:
|
151
161
|
# Timeout: Number of seconds to wait for data until
|
152
162
|
# giving up. Set to nil for blocking.
|
153
|
-
def has_data?
|
163
|
+
def has_data? **kwargs
|
154
164
|
return false unless @socket
|
155
165
|
@socket.has_data? kwargs
|
156
166
|
end
|
@@ -169,13 +179,13 @@ module Ionian
|
|
169
179
|
|
170
180
|
# Writes the given string(s) to the socket and appends a
|
171
181
|
# newline character to any string not already ending with one.
|
172
|
-
def puts
|
173
|
-
self.write string.map{|s| s.chomp}.join("\n") + "\n"
|
182
|
+
def puts *string
|
183
|
+
self.write string.map{ |s| s.chomp }.join("\n") + "\n"
|
174
184
|
end
|
175
185
|
|
176
186
|
# Writes the given string to the socket. Returns the number of
|
177
187
|
# bytes written.
|
178
|
-
def write
|
188
|
+
def write string
|
179
189
|
create_socket unless @persistent
|
180
190
|
|
181
191
|
num_bytes = 0
|
@@ -255,8 +265,8 @@ module Ionian
|
|
255
265
|
# This was chosen over method_missing to avoid traversing the object
|
256
266
|
# hierarchy on every method call, like transmitting data.
|
257
267
|
@socket.methods
|
258
|
-
.select {|m| @socket.respond_to? m}
|
259
|
-
.select {|m| not self.respond_to? m}
|
268
|
+
.select { |m| @socket.respond_to? m }
|
269
|
+
.select { |m| not self.respond_to? m }
|
260
270
|
.each do |m|
|
261
271
|
self.singleton_class.send :define_method, m do |*args, &block|
|
262
272
|
@socket.__send__ m, *args, &block
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ionian
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.6.
|
4
|
+
version: 0.6.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alex McLain
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-04-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|