本文簡要介紹ruby語言中 BasicSocket.recvmsg
的用法。
用法
recvmsg(maxmesglen=nil, flags=0, maxcontrollen=nil, opts={}) → [mesg, sender_addrinfo, rflags, *controls]
recvmsg 使用 recvmsg(2) 係統調用以阻塞方式接收消息。
maxmesglen
是要接收的消息的最大長度。
flags
是 MSG_* 常量的按位或,例如 Socket::MSG_PEEK。
maxcontrollen
是要接收的控件(輔助數據)的最大長度。
opts
是選項哈希。目前 :scm_rights=>bool 是唯一的選擇。
:scm_rights 選項指定應用程序需要 SCM_RIGHTS 控製消息。如果該值為 nil 或 false,則應用程序不需要 SCM_RIGHTS 控製消息。在這種情況下,recvmsg 會立即關閉傳遞的文件說明符。這是默認行為。
如果 :scm_rights 值既不是 nil 也不是 false,應用程序需要 SCM_RIGHTS 控製消息。在這種情況下,recvmsg 為 Socket::AncillaryData#unix_rights
方法的每個文件說明符創建 IO
對象。
返回值為 4 元素數組。
mesg
是接收到的消息的字符串。
sender_addrinfo
是connection-less 套接字的發送方套接字地址。它是一個 Addrinfo
對象。對於 TCP 等 connection-oriented 套接字,sender_addrinfo 取決於平台。
rflags
是接收到的消息上的標誌,它是 MSG_* 常量的按位或,例如 Socket::MSG_TRUNC。如果係統使用 4.3BSD 風格的舊 recvmsg 係統調用,它將為零。
controls
是輔助數據,它是 Socket::AncillaryData
對象的數組,例如:
#<Socket::AncillaryData: AF_UNIX SOCKET RIGHTS 7>
maxmesglen
和 maxcontrollen
可以為 nil。在這種情況下,緩衝區將不斷增長,直到消息未被截斷。在內部,使用MSG_PEEK。檢查緩衝區已滿和MSG_CTRUNC 是否被截斷。
recvmsg 可用於實現recv_io,如下所示:
mesg, sender_sockaddr, rflags, *controls = sock.recvmsg(:scm_rights=>true)
controls.each {|ancdata|
if ancdata.cmsg_is?(:SOCKET, :RIGHTS)
return ancdata.unix_rights[0]
end
}
相關用法
- Ruby BasicSocket.recv用法及代碼示例
- Ruby BasicSocket.recv_nonblock用法及代碼示例
- 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.recvmsg。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。