Class: TCPSocket
- Defined in:
- lib/polyphony/extensions/socket.rb
Overview
Overide stock TCPSocket code by encapsulating a Socket instance
Direct Known Subclasses
Instance Method Summary collapse
-
#<<(msg) ⇒ Object
:nop-doc:.
-
#close ⇒ TCPSocket
Closes the socket.
-
#closed? ⇒ bool
Returns true if the socket is closed.
-
#dont_linger ⇒ ::Socket
Sets the linger option to 0.
-
#feed_loop(receiver, method = :call, &block) ⇒ Socket
Receives data from the socket in an infinite loop, passing the data to the given receiver using the given method.
-
#initialize(remote_host, remote_port, local_host = nil, local_port = nil) ⇒ TCPSocket
constructor
Initializes the socket.
-
#no_delay ⇒ ::Socket
Sets the
NODELAYoption. -
#read(len = nil, buf = nil, buffer_pos = 0) ⇒ String
Reads from the socket.
-
#read_nonblock(maxlen, buf = nil, exception: true) ⇒ String, :wait_readable
Performs a non-blocking read from the socket of up to
maxlenbytes. -
#readpartial(maxlen, buf = +'',, buffer_pos = 0, raise_on_eof = true) ⇒ String?
Reads up to
maxlenfrom the socket. -
#recv(maxlen, flags = 0, outbuf = nil) ⇒ String
Receives up to
maxlenbytes from the socket. -
#recv_loop(maxlen = 8192) {|String| ... } ⇒ Socket
(also: #read_loop)
Receives up to
maxlenbytes at a time in an infinite loop. -
#reuse_addr ⇒ ::Socket
Sets the
REUSEADDRoption. -
#reuse_port ⇒ ::Socket
Sets the
REUSEPORToption. -
#send(msg, flags) ⇒ Object
:nop-doc:.
-
#setsockopt(*args) ⇒ TCPSocket
Calls
setsockoptwith the given arguments. -
#write(*args) ⇒ Object
:nop-doc:.
-
#write_nonblock(buf, exception: true) ⇒ Integer, :wait_readable
Performs a non-blocking to the socket.
Constructor Details
#initialize(remote_host, remote_port, local_host = nil, local_port = nil) ⇒ TCPSocket
Initializes the socket.
240 241 242 243 244 245 246 247 248 249 250 251 252 |
# File 'lib/polyphony/extensions/socket.rb', line 240 def initialize(remote_host, remote_port, local_host = nil, local_port = nil) remote_addr = Addrinfo.tcp(remote_host, remote_port) @io = Socket.new remote_addr.afamily, Socket::SOCK_STREAM if local_host && local_port addr = Addrinfo.tcp(local_host, local_port) @io.bind(addr) end return unless remote_host && remote_port addr = Addrinfo.tcp(remote_host, remote_port) @io.connect(addr) end |
Instance Method Details
#<<(msg) ⇒ Object
:nop-doc:
20 21 22 23 |
# File 'ext/polyphony/socket_extensions.c', line 20 VALUE Socket_double_chevron(VALUE self, VALUE msg) { Backend_send(BACKEND(), self, msg, INT2FIX(0)); return self; } |
#close ⇒ TCPSocket
Closes the socket.
260 261 262 263 |
# File 'lib/polyphony/extensions/socket.rb', line 260 def close @io ? @io.close : orig_close self end |
#closed? ⇒ bool
Returns true if the socket is closed.
282 283 284 |
# File 'lib/polyphony/extensions/socket.rb', line 282 def closed? @io ? @io.closed? : orig_closed? end |
#dont_linger ⇒ ::Socket
Sets the linger option to 0.
289 290 291 292 |
# File 'lib/polyphony/extensions/socket.rb', line 289 def dont_linger setsockopt(Socket::SOL_SOCKET, Socket::SO_LINGER, Socket::ZERO_LINGER) self end |
#feed_loop(receiver, method = :call, &block) ⇒ Socket
Receives data from the socket in an infinite loop, passing the data to the given receiver using the given method. If a block is given, the result of the method call to the receiver is passed to the block.
This method can be used to feed data into parser objects. The following example shows how to feed data from a socket directly into a MessagePack unpacker:
unpacker = MessagePack::Unpacker.new conn.feed_loop(unpacker, :feed_each) { |msg| handle_msg(msg) }
389 390 391 |
# File 'lib/polyphony/extensions/socket.rb', line 389 def feed_loop(receiver, method = :call, &block) Polyphony.backend_recv_feed_loop(self, receiver, method, &block) end |
#no_delay ⇒ ::Socket
Sets the NODELAY option.
297 298 299 300 |
# File 'lib/polyphony/extensions/socket.rb', line 297 def no_delay setsockopt(Socket::IPPROTO_TCP, Socket::TCP_NODELAY, 1) self end |
#read(len = nil, buf = nil, buffer_pos = 0) ⇒ String
Reads from the socket. If maxlen is given, reads up to maxlen bytes from
the socket, otherwise reads to EOF. If buf is given, it is used as the
buffer to read into, otherwise a new string is allocated. If buffer_pos is
given, reads into the given offset (in bytes) in the given buffer. If the
given buffer offset is negative, it is calculated from the current end of
the buffer (-1 means the read data will be appended to the end of the
buffer).
If no bytes are available and EOF is not hit, this method will block until
the socket is ready to read from.
336 337 338 339 340 341 342 343 344 345 346 347 |
# File 'lib/polyphony/extensions/socket.rb', line 336 def read(len = nil, buf = nil, buffer_pos = 0) return '' if len == 0 return Polyphony.backend_read(self, buf, len, true, buffer_pos) if buf @read_buffer ||= +'' result = Polyphony.backend_read(self, @read_buffer, len, true, -1) return nil unless result already_read = @read_buffer @read_buffer = +'' already_read end |
#read_nonblock(maxlen, buf = nil, exception: true) ⇒ String, :wait_readable
Performs a non-blocking read from the socket of up to maxlen bytes. If
buf is given, it is used as the read buffer, otherwise a new string will
be allocated. If the socket is not ready for reading and exception is
true, an IO::WaitReadable will be raised. If the socket is not ready for
reading and exception is false, :wait_readable is returned.
426 427 428 |
# File 'lib/polyphony/extensions/socket.rb', line 426 def read_nonblock(maxlen, buf = nil, exception: true) @io.read_nonblock(maxlen, buf, exception:) end |
#readpartial(maxlen, buf = +'',, buffer_pos = 0, raise_on_eof = true) ⇒ String?
Reads up to maxlen from the socket. If buf is given, it is used as the
buffer to read into, otherwise a new string is allocated. If buffer_pos is
given, reads into the given offset (in bytes) in the given buffer. If the
given buffer offset is negative, it is calculated from the current end of
the buffer (-1 means the read data will be appended to the end of the
buffer). If raise_on_eof is true (the default,) an EOFError will be
raised on EOF, otherwise nil will be returned.
If no bytes are available and EOF is not hit, this method will block until
the socket is ready to read from.
409 410 411 412 413 414 |
# File 'lib/polyphony/extensions/socket.rb', line 409 def readpartial(maxlen, buf = +'', buffer_pos = 0, raise_on_eof = true) result = Polyphony.backend_recv(self, buf, maxlen, buffer_pos) raise EOFError if !result && raise_on_eof result end |
#recv(maxlen, flags = 0, outbuf = nil) ⇒ String
Receives up to maxlen bytes from the socket. If outbuf is given, it is
used as the buffer to receive into, otherwise a new string is allocated and
used as buffer.
If no bytes are available, this method will block until the socket is ready to receive from.
360 361 362 |
# File 'lib/polyphony/extensions/socket.rb', line 360 def recv(maxlen, flags = 0, outbuf = nil) Polyphony.backend_recv(self, outbuf || +'', maxlen, 0) end |
#recv_loop(maxlen = 8192) {|String| ... } ⇒ Socket Also known as: read_loop
Receives up to maxlen bytes at a time in an infinite loop. Read buffers
will be passed to the given block.
370 371 372 |
# File 'lib/polyphony/extensions/socket.rb', line 370 def recv_loop(maxlen = 8192, &block) Polyphony.backend_recv_loop(self, maxlen, &block) end |
#reuse_addr ⇒ ::Socket
Sets the REUSEADDR option.
305 306 307 308 |
# File 'lib/polyphony/extensions/socket.rb', line 305 def reuse_addr setsockopt(Socket::SOL_SOCKET, Socket::SO_REUSEADDR, 1) self end |
#reuse_port ⇒ ::Socket
Sets the REUSEPORT option.
313 314 315 316 |
# File 'lib/polyphony/extensions/socket.rb', line 313 def reuse_port setsockopt(::Socket::SOL_SOCKET, ::Socket::SO_REUSEPORT, 1) self end |
#send(msg, flags) ⇒ Object
:nop-doc:
5 6 7 |
# File 'ext/polyphony/socket_extensions.c', line 5 VALUE Socket_send(VALUE self, VALUE msg, VALUE flags) { return Backend_send(BACKEND(), self, msg, flags); } |
#setsockopt(*args) ⇒ TCPSocket
Calls setsockopt with the given arguments.
271 272 273 274 |
# File 'lib/polyphony/extensions/socket.rb', line 271 def setsockopt(*args) @io ? @io.setsockopt(*args) : orig_setsockopt(*args) self end |
#write(*args) ⇒ Object
:nop-doc:
11 12 13 14 15 16 |
# File 'ext/polyphony/socket_extensions.c', line 11 VALUE Socket_write(int argc, VALUE *argv, VALUE self) { VALUE ary = rb_ary_new_from_values(argc, argv); VALUE result = Backend_sendv(BACKEND(), self, ary, INT2FIX(0)); RB_GC_GUARD(ary); return result; } |
#write_nonblock(buf, exception: true) ⇒ Integer, :wait_readable
Performs a non-blocking to the socket. If the socket is not ready for
writing and exception is true, an IO::WaitWritable will be raised. If
the socket is not ready for writing and exception is false,
:wait_writable is returned.
438 439 440 |
# File 'lib/polyphony/extensions/socket.rb', line 438 def write_nonblock(buf, exception: true) @io.write_nonblock(buf, exception:) end |