Class: LWES::Listener

Inherits:
Object
  • Object
show all
Defined in:
lib/lwes/listener.rb,
ext/lwes_ext/listener.c

Overview

This class is only supported on Ruby 1.9

listener = LWES::Listener.new :address => "224.1.1.11", :port => 12345
listener.each do |event|
  p event
end

Instance Method Summary collapse

Instance Method Details

#closeObject

listener.close => nil

Closes the socket used by the LWES::Listener object. Raises IOError if already closed.



35
36
37
38
39
40
41
42
43
44
45
46
# File 'ext/lwes_ext/listener.c', line 35

static VALUE listener_close(VALUE self)
{
	struct lwes_listener *listener = listener_ptr(self);
	int err;

	DATA_PTR(self) = NULL;
	errno = 0;
	err = lwes_listener_destroy(listener);
	if (err)
		fail(err, "lwes_listener_destroy()");
	return Qnil;
}

#dupObject Also known as: clone

we disallow dup-ing objects since GC could double-free otherwise



12
13
14
# File 'lib/lwes/listener.rb', line 12

def dup
  self
end

#eachObject

processes each LWES::Event object as it is received, yielding the LWES::Event to a given block



20
21
22
23
24
25
26
# File 'lib/lwes/listener.rb', line 20

def each
  begin
    yield recv
  rescue Errno::EINTR
  end while true
  self
end

#recv(*args) ⇒ Object

listener.recv => LWES::Event listener.recv(timeout_ms) => LWES::Event or nil

Receives and returns one LWES::Event from the network. An optional timeout (in milliseconds) may be specified and cause this to return nil on timeout. This method is only available under Ruby 1.9.



129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
# File 'ext/lwes_ext/listener.c', line 129

static VALUE listener_recv(int argc, VALUE *argv, VALUE self)
{
	struct recv_args args;
	VALUE timeout;
	int r, saved_errno;

	rb_scan_args(argc, argv, "01", &timeout);

	args.listener = listener_ptr(self);
	args.event = lwes_event_create_no_name(NULL);
	args.timeout_ms = NIL_P(timeout) ? UINT_MAX : NUM2UINT(timeout);

	saved_errno = errno = 0;
	r = (int)rb_thread_blocking_region(recv_event, &args, RUBY_UBF_IO, 0);
	if (r >= 0)
		return lwesrb_wrap_event(cLWES_Event, args.event);
	saved_errno = errno;
	(void)lwes_event_destroy(args.event);
	if (r == -2 && ! NIL_P(timeout))
		return Qnil;
	errno = saved_errno;
	fail(r, "lwes_listener_recv(_by)");
	return Qnil;
}