socket.recvfrom_nonblock(maxlen, flags) => [mesg, sender_addrinfo]
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_addrinfo, contains protocol-specific address
information of the sender.
When recvfrom(2) returns 0, #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 maximum number of bytes to receive from the socket -
flags
- zero or more of theMSG_
options
Example
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 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_addrinfo = socket.accept begin # emulate blocking recvfrom pair = client.recvfrom_nonblock( 20 ) rescue IO ::WaitReadable 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 #recvfrom for the exceptions that may be thrown if the call to recvfrom_nonblock fails.
#recvfrom_nonblock may raise any error corresponding to recvfrom(2) failure, including Errno::EWOULDBLOCK.
If the exception is Errno::EWOULDBLOCK or Errno::AGAIN, it is extended by IO::WaitReadable. So IO::WaitReadable can be used to rescue the exceptions for retrying recvfrom_nonblock.
Please login to continue.