/* * call-seq: * socket.recvfrom_nonblock(maxlen) => [mesg, sender_sockaddr] * socket.recvfrom_nonblock(maxlen, flags) => [mesg, sender_sockaddr] * * Receives up to _maxlen_ bytes from +socket+ using recvfrom(2) after * O_NONBLOCK is set for the underlying file descriptor. * _flags_ is zero or more of the +MSG_+ options. * The first element of the results, _mesg_, is the data received. * The second element, _sender_sockaddr_, contains protocol-specific information * on the sender. * * When recvfrom(2) returns 0, Socket#recvfrom_nonblock returns * an empty string as data. * The meaning depends on the socket: EOF on TCP, empty packet on UDP, etc. * * === Parameters * * +maxlen+ - the number of bytes to receive from the socket * * +flags+ - zero or more of the +MSG_+ options * * === Example * # In one file, start this first * require 'socket' * include Socket::Constants * socket = Socket.new(AF_INET, SOCK_STREAM, 0) * sockaddr = Socket.sockaddr_in(2200, 'localhost') * socket.bind(sockaddr) * socket.listen(5) * client, client_sockaddr = socket.accept * begin * pair = client.recvfrom_nonblock(20) * rescue Errno::EAGAIN * IO.select([client]) * retry * end * data = pair[0].chomp * puts "I only received 20 bytes '#{data}'" * sleep 1 * socket.close * * # In another file, start this second * require 'socket' * include Socket::Constants * socket = Socket.new(AF_INET, SOCK_STREAM, 0) * sockaddr = Socket.sockaddr_in(2200, 'localhost') * socket.connect(sockaddr) * socket.puts "Watch this get cut short!" * socket.close * * Refer to Socket#recvfrom for the exceptions that may be thrown if the call * to _recvfrom_nonblock_ fails. * * Socket#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure, * including Errno::EAGAIN. * * === See * * Socket#recvfrom */ static VALUE sock_recvfrom_nonblock(int argc, VALUE *argv, VALUE sock) { return s_recvfrom_nonblock(sock, argc, argv, RECV_SOCKET); }