class EventMachine::EvmaUDPSocket

@private

Public Class Methods

create(host, port) click to toggle source
# File lib/em/pure_ruby.rb, line 1223
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

Public Instance Methods

eventable_read() click to toggle source

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.

# File lib/em/pure_ruby.rb, line 1257
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() click to toggle source

eventable_write This really belongs in DatagramObject, but there is some UDP-specific stuff.

# File lib/em/pure_ruby.rb, line 1232
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) click to toggle source
# File lib/em/pure_ruby.rb, line 1276
def send_data data
  send_datagram data, @return_address
end