本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。