本文簡要介紹ruby語言中 BasicSocket.recv_nonblock
的用法。
用法
recv_nonblock(maxlen [, flags [, buf [, options ]]]) → mesg
在為底層文件說明符設置 O_NONBLOCK 後,使用 recvfrom(2) 從 socket
接收最多 maxlen
字節。 flags
是零個或多個 MSG_
選項。結果 mesg
是接收到的數據。
當 recvfrom(2) 返回 0 時, Socket#recv_nonblock
返回一個空字符串作為數據。含義取決於套接字:TCP上的EOF,UDP上的空包等。
參數
-
maxlen
- 從套接字接收的字節數 -
flags
- 零個或多個MSG_
選項 -
buf
- 目標String
緩衝區 -
options
- 關鍵字哈希,支持“異常:假”
示例
serv = TCPServer.new("127.0.0.1", 0)
af, port, host, addr = serv.addr
c = TCPSocket.new(addr, port)
s = serv.accept
c.send "aaa", 0
begin # emulate blocking recv.
p s.recv_nonblock(10) #=> "aaa"
rescue IO::WaitReadable
IO.select([s])
retry
end
如果對 recv_nonblock
的調用失敗,請參閱 Socket#recvfrom
以了解可能引發的異常。
BasicSocket#recv_nonblock
可能引發與 recvfrom(2) 失敗相對應的任何錯誤,包括 Errno::EWOULDBLOCK。
如果異常是 Errno::EWOULDBLOCK 或 Errno::EAGAIN,則通過 IO::WaitReadable
對其進行擴展。所以 IO::WaitReadable
可以用來挽救重試recv_nonblock的異常。
通過將關鍵字參數 exception
指定為 false
,您可以指示 recv_nonblock
不應引發 IO::WaitReadable
異常,而是返回符號 :wait_readable
。
參看
相關用法
- Ruby BasicSocket.recv用法及代碼示例
- Ruby BasicSocket.recvmsg用法及代碼示例
- Ruby BasicSocket.remote_address用法及代碼示例
- Ruby BasicSocket.send用法及代碼示例
- Ruby BasicSocket.do_not_reverse_lookup用法及代碼示例
- Ruby BasicSocket.do_not_reverse_lookup =用法及代碼示例
- Ruby BasicSocket.connect_address用法及代碼示例
- Ruby BasicSocket.getsockopt用法及代碼示例
- Ruby BasicSocket.getpeereid用法及代碼示例
- Ruby BasicSocket.local_address用法及代碼示例
- Ruby BasicSocket.shutdown用法及代碼示例
- Ruby BasicSocket.close_read用法及代碼示例
- Ruby BasicSocket.getpeername用法及代碼示例
- Ruby BasicSocket.getsockname用法及代碼示例
- Ruby BasicSocket.sendmsg用法及代碼示例
- Ruby BasicSocket.close_write用法及代碼示例
- Ruby BasicSocket.setsockopt用法及代碼示例
- Ruby BasicSocket.for_fd用法及代碼示例
- Ruby BasicSpecification.require_paths用法及代碼示例
- Ruby BasicObject.equal?用法及代碼示例
- Ruby BasicObject.instance_eval用法及代碼示例
- Ruby BasicObject.obj ==用法及代碼示例
- Ruby BasicObject.method_missing用法及代碼示例
- Ruby BasicObject.singleton_method_undefined用法及代碼示例
- Ruby BasicObject.send用法及代碼示例
注:本文由純淨天空篩選整理自ruby-lang.org大神的英文原創作品 BasicSocket.recv_nonblock。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。