Class: EventMachine::EvmaUDPSocket
- Inherits:
-
DatagramObject
- Object
- Selectable
- DatagramObject
- EventMachine::EvmaUDPSocket
- Defined in:
- lib/pr_eventmachine.rb
Instance Attribute Summary
Attributes inherited from Selectable
Class Method Summary collapse
Instance Method Summary collapse
-
#eventable_read ⇒ Object
Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006.
-
#eventable_write ⇒ Object
#eventable_write This really belongs in DatagramObject, but there is some UDP-specific stuff.
- #send_data(data) ⇒ Object
Methods inherited from DatagramObject
#get_outbound_data_size, #initialize, #select_for_reading?, #select_for_writing?, #send_datagram
Methods inherited from Selectable
#close_scheduled?, #get_peername, #heartbeat, #initialize, #select_for_reading?, #select_for_writing?, #set_inactivity_timeout
Constructor Details
This class inherits a constructor from EventMachine::DatagramObject
Class Method Details
.create(host, port) ⇒ Object
958 959 960 961 962 |
# File 'lib/pr_eventmachine.rb', line 958 def create host, port sd = Socket.new( Socket::AF_INET, Socket::SOCK_DGRAM, 0 ) sd.bind Socket::pack_sockaddr_in( port, host ) EvmaUDPSocket.new sd end |
Instance Method Details
#eventable_read ⇒ Object
Proper nonblocking I/O was added to Ruby 1.8.4 in May 2006. If we have it, then we can read multiple times safely to improve performance.
992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 |
# File 'lib/pr_eventmachine.rb', line 992 def eventable_read begin if io.respond_to?(:recvfrom_nonblock) 40.times { data,@return_address = io.recvfrom_nonblock(16384) EventMachine::event_callback uuid, ConnectionData, data @return_address = nil } else raise "unimplemented datagram-read operation on this Ruby" end rescue Errno::EAGAIN # no-op rescue Errno::ECONNRESET, EOFError @close_scheduled = true EventMachine::event_callback uuid, ConnectionUnbound, nil end end |
#eventable_write ⇒ Object
#eventable_write This really belongs in DatagramObject, but there is some UDP-specific stuff.
967 968 969 970 971 972 973 974 975 976 977 978 979 980 981 982 983 984 985 986 987 |
# File 'lib/pr_eventmachine.rb', line 967 def eventable_write 40.times { break if @outbound_q.empty? begin data,target = @outbound_q.first # This damn better be nonblocking. io.send data.to_s, 0, target @outbound_q.shift rescue Errno::EAGAIN # It's not been observed in testing that we ever get here. # True to the definition, packets will be accepted and quietly dropped # if the system is under pressure. break rescue EOFError, Errno::ECONNRESET @close_scheduled = true @outbound_q.clear end } end |
#send_data(data) ⇒ Object
1013 1014 1015 |
# File 'lib/pr_eventmachine.rb', line 1013 def send_data data send_datagram data, @return_address end |