当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby BasicSocket.recvmsg用法及代码示例


本文简要介绍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>

maxmesglenmaxcontrollen 可以为 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-lang.org大神的英文原创作品 BasicSocket.recvmsg。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。