2

recvmmsg() が戻った後に msghdr.msg_namelen を出力しましたが、設定されていません。

ただし、msg_len は正しく設定されています。

マルチキャスト トラフィック (データグラムなど) をリッスンしています。

recvmmsg() が msghdr を生成するために必要なことはありますか?

代わりに recvmsg() を呼び出そうとしました。msghdr も入力されていません。何か案が?

4

1 に答える 1

1

カーネルでは、recvmsg() と recvmmsg() の両方に、msg_namelen と msg_name を入力引数として使用する共通のサブコールがあります。つまり、これらのメンバーを自分で設定する必要があります。

そのように考えることができます。msg_name は、recvmsg() を呼び出す前にカーネルに提供する文字列領域へのポインターです。msg_namelen を設定しないと、カーネルは msg_name 領域の長さを知ることができず、メモリ アクセス エラーを発生させずに msg_name 領域にコピーできるバイト数もわかりません。

于 2013-09-11T05:23:46.773 に答える