Ruby 2.4.0 リファレンスマニュアル > ライブラリ一覧 > socketライブラリ > BasicSocketクラス > recvmsg

instance method BasicSocket#recvmsg

recvmsg(maxmesglen=nil, flags=0, maxcontrollen=nil, opts={}) -> [String, Addrinfo, Integer, *Socket::AncillaryData][permalink][rdoc]

recvmsg(2) を用いてメッセージを受け取ります。

このメソッドはブロックします。ノンブロッキング方式で通信したい場合は BasicSocket#recvmsg_nonblock を用います。

maxmesglen, maxcontrollen で受け取るメッセージおよび補助データ (Socket::AncillaryData)の最大長をバイト単位で指定します。省略した場合は必要なだけ内部バッファを拡大してデータが切れないようにします。

flags では Socket::MSG_* という名前の定数の biwsise OR を取ったものを渡します。

opts にはその他のオプションを渡します。今のところ :scm_right => bool というオプションのみ利用できます。このオプションに真を渡すと、 SCM_RIGHTS 制御メッセージを受け取ったときに、メッセージに含まれる IO オブジェクトを生成します。詳しくは Socket::AncillaryData#unix_rights を参照してください。

返り値は配列で得られます。

返り値の配列の最初の要素は受け取ったメッセージを表す文字列です。

2番目の要素は connection-less socket の場合には送り元のアドレスが Addrinfo オブジェクトとして含まれています。 TCP のような connection-oriented socket の場合は何が含まれているかはプラットフォーム依存です。

3番目の要素は受け取ったメッセージに付加されているフラグで、 Socket::MSG_* 定数の bitwise OR で表現されています。

残りの要素は補助データ(Socket::AncillaryData オブジェクト)です。

require 'socket'

# UnixSocket#recv_io を recvmsg で実装する例
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
}
[PARAM] maxmesglen:
受け取るメッセージの最大長
[PARAM] flags:
フラグ
[PARAM] maxcontrollen:
受け取る補助データの最大長
[PARAM] opts:
ハッシュオプション