當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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