本文簡要介紹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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。