本文简要介绍ruby语言中  Socket.recvfrom_nonblock  的用法。
用法
recvfrom_nonblock(maxlen[, flags[, outbuf[, opts]]]) → [mesg, sender_addrinfo]在为底层文件说明符设置 O_NONBLOCK 后,使用 recvfrom(2) 从 socket 接收最多 maxlen 字节。 flags 是零个或多个 MSG_ 选项。结果的第一个元素 mesg 是接收到的数据。第二个元素 sender_addrinfo 包含发送方的协议特定地址信息。
当 recvfrom(2) 返回 0 时, Socket#recvfrom_nonblock  返回一个空字符串作为数据。含义取决于套接字:TCP上的EOF,UDP上的空包等。
参数
- 
maxlen- 从套接字接收的最大字节数
- 
flags- 零个或多个MSG_选项
- 
outbuf- 目标String缓冲区
- 
opts- 关键字哈希,支持“异常:假”
示例
# 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如果对 recvfrom_nonblock 的调用失败,请参阅  Socket#recvfrom  以了解可能引发的异常。
 Socket#recvfrom_nonblock  可能引发与 recvfrom(2) 失败相对应的任何错误,包括 Errno::EWOULDBLOCK。
如果异常是 Errno::EWOULDBLOCK 或 Errno::EAGAIN,则通过  IO::WaitReadable  对其进行扩展。所以 IO::WaitReadable 可以用来挽救重试recvfrom_nonblock的异常。
通过将关键字参数 exception 指定为 false ,您可以指示  recvfrom_nonblock  不应引发  IO::WaitReadable  异常,而是返回符号 :wait_readable。
参看
相关用法
- Ruby Socket.recvfrom用法及代码示例
- Ruby Socket.pair用法及代码示例
- Ruby Socket.udp_server_sockets用法及代码示例
- Ruby Socket.unpack_sockaddr_in用法及代码示例
- Ruby Socket.udp_server_recv用法及代码示例
- Ruby Socket.new用法及代码示例
- Ruby Socket.tcp用法及代码示例
- Ruby Socket.getservbyport用法及代码示例
- Ruby Socket.listen用法及代码示例
- Ruby Socket.gethostname用法及代码示例
- Ruby Socket.unix_server_loop用法及代码示例
- Ruby Socket.sockaddr_un用法及代码示例
- Ruby Socket.accept用法及代码示例
- Ruby Socket.tcp_server_sockets用法及代码示例
- Ruby Socket.bind用法及代码示例
- Ruby Socket.getaddrinfo用法及代码示例
- Ruby Socket.getnameinfo用法及代码示例
- Ruby Socket.unix_server_socket用法及代码示例
- Ruby Socket.accept_nonblock用法及代码示例
- Ruby Socket.unix用法及代码示例
- Ruby Socket.gethostbyaddr用法及代码示例
- Ruby Socket.ip_address_list用法及代码示例
- Ruby Socket.sysaccept用法及代码示例
- Ruby Socket.getservbyname用法及代码示例
- Ruby Socket.connect_nonblock用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Socket.recvfrom_nonblock。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
