class ZMQ::Util
General utility methods.
Public Class Methods
Attempts to bind to a random tcp port on host
up to max_tries
times. Returns the port number upon success or nil upon failure.
# File lib/ffi-rzmq/util.rb, line 51 def self.bind_to_random_tcp_port host = '127.0.0.1', max_tries = 500 tries = 0 rc = -1 while !resultcode_ok?(rc) && tries < max_tries tries += 1 random = random_port rc = socket.bind "tcp://#{host}:#{random}" end resultcode_ok?(rc) ? random : nil end
Generate and return a CURVE public/private keypair
Raises an error if ZeroMQ is not configured for CURVE connections. Install libsodium if this is the case.
# File lib/ffi-rzmq/util.rb, line 12 def self.curve_keypair public_key = FFI::MemoryPointer.from_string(' ' * 41) private_key = FFI::MemoryPointer.from_string(' ' * 41) rc = LibZMQ.zmq_curve_keypair public_key, private_key if rc < 0 raise NotSupportedError.new "zmq_curve_keypair" , rc, ZMQ::Util.errno, "Rebuild zeromq with libsodium to enable CURVE security options." end [public_key.read_string, private_key.read_string] end
Returns the errno
as set by the libzmq library.
# File lib/ffi-rzmq/util.rb, line 37 def self.errno LibZMQ.zmq_errno end
Called to verify whether there were any errors during operation. If any are found, raise the appropriate #ZeroMQError.
When no error is found, this method returns true
which is behavior used internally by send and recv.
# File lib/ffi-rzmq/util.rb, line 71 def self.error_check source, result_code if -1 == result_code raise_error source, result_code end # used by Socket::send/recv, ignored by others true end
Returns a string corresponding to the currently set errno. These error strings are defined by libzmq.
# File lib/ffi-rzmq/util.rb, line 44 def self.error_string LibZMQ.zmq_strerror(errno).read_string end
Returns true when rc
is greater than or equal to 0, false otherwise.
We use the >= test because zmq_poll() returns the number of sockets that had a read or write event triggered. So, a >= 0 result means it succeeded.
# File lib/ffi-rzmq/util.rb, line 31 def self.resultcode_ok? rc rc >= 0 end
Private Class Methods
# File lib/ffi-rzmq/util.rb, line 105 def self.context_error?(source) 'zmq_ctx_new' == source || 'zmq_ctx_set' == source || 'zmq_ctx_get' == source || 'zmq_ctx_destory' == source || 'zmq_ctx_set_monitor' == source end
# File lib/ffi-rzmq/util.rb, line 101 def self.eagain? EAGAIN == ZMQ::Util.errno end
# File lib/ffi-rzmq/util.rb, line 113 def self.message_error?(source) ['zmq_msg_init', 'zmq_msg_init_data', 'zmq_msg_copy', 'zmq_msg_move', 'zmq_msg_close', 'zmq_msg_get', 'zmq_msg_more', 'zmq_msg_recv', 'zmq_msg_send', 'zmq_msg_set'].include?(source) end
# File lib/ffi-rzmq/util.rb, line 88 def self.raise_error source, result_code if context_error?(source) raise ContextError.new source, result_code, ZMQ::Util.errno, ZMQ::Util.error_string elsif message_error?(source) raise MessageError.new source, result_code, ZMQ::Util.errno, ZMQ::Util.error_string else raise ZeroMQError.new source, result_code, -1, "Source [#{source}] does not match any zmq_* strings, rc [#{result_code}], errno [#{ZMQ::Util.errno}], error_string [#{ZMQ::Util.error_string}]" end end
generate a random port between 10_000 and 65534
# File lib/ffi-rzmq/util.rb, line 84 def self.random_port rand(55534) + 10_000 end