sendmmsg サブルーチン

目的

メッセージ構造を使用して、ソケットから複数のメッセージを送信します。

構文

       #include  <sys/types.h>
       #include  <sys/socketvar.h>
       #include  <sys/socket.h>

       int sendmmsg (Socket, Messages, Flags)

       int Socket;

       struct mmsghdr Message [];

       int Flags;

説明

sendmmsg サブルーチンは、 mmsghdr メッセージ構造体を使用して、接続されたソケットまたは接続されていないソケットを介してメッセージを送信します。 /usr/include/sys/socket.h ファイルには、 mmsghdr メッセージ構造体が含まれ、構造体メンバーを定義します。 このサブルーチンは、 sendmsg サブルーチンの拡張です。

パラメーター

ソケット
ソケット記述子を指定します。
メッセージ
送信されるメッセージを含む mmsghdr メッセージ構造の配列を指します。
フラグ
送信側がメッセージ伝送を制御できるようにします。 呼び出しを送信するために使用される Flags パラメーターは、フラグ値の論理 OR 演算によって形成されます。 sendmmsg サブルーチンは、 sendmsg サブルーチンと同じフラグ値を受け入れます。 sys/socket.h ファイルには、 Flags パラメーターが含まれています。

戻り値

正常終了すると、 sendmmsg サブルーチンは送信されたメッセージの数を戻します。

sendmmsg サブルーチンは、各 mmsghdr 構造体の msg_len 属性を更新して、対応するメッセージから送信されるバイト数を示します。

sendmmsg サブルーチンが失敗すると、システム・ハンドラーは以下の機能を実行します。

  • 呼び出し元のプログラムに-1を返す。
  • 特定のエラーを示すエラー・コードを エラー番号 グローバル変数に移動します。

エラー・コード

以下のいずれかのエラーが発生すると、 sendmmsg サブルーチンは失敗します。

エラー 説明
EACCES 指定されたソケットへの書き込みアクセスが拒否されたか、ブロードキャスト・パケットを送信しようとしているソケットにブロードキャスト機能がありません。
EADDRNOTAVAIL 指定されたアドレスは有効なアドレスではありません。
EAFNOSUPPORT 指定されたアドレスは、ソケットのアドレス・ファミリーの有効なアドレスではありません。
EBADF Socket パラメーターが有効ではありません。
ECONNRESET 接続はピアによって強制的にクローズされました。
EDESTADDRREQ ソケットは接続モードではなく、ピア・アドレスが設定されていません。
EFAULT Address パラメーターは、ユーザー・アドレス・スペースの書き込み可能部分にはありません。
EHOSTUNREACH 宛先ホストに到達できません。
EINTR データが伝送される前に、シグナルが sendmmsg サブルーチンに割り込まれました。
EINVAL msghdr 構造体の長さが無効です。
EISCONN SOCK_DGRAM ソケットは既に接続されています。
EMSGSIZE メッセージが大きすぎて一緒に送信できない (ソケット要件により) か、または Messages パラメーターが指す msghdr 構造体の msg_iovlen メンバーが 0 以下であるか、または IOV_MAX 値より大きくなっています。
ENOENT パス名が既存のファイルを指していないか、パス名が空ストリングです。
ENETUNREACH 宛先ネットワークに到達できません。
ENOBUFS システムが内部データ構造のためのメモリーを使い尽くしました。
ENOMEM メモリー内の使用可能なデータ・スペースが、グループ情報またはアクセス制御リスト (ACL) 情報を保持するのに十分な大きさではありません。
ENOPROTOOPT プロトコルは 64 ビットをサポートしません。
ENOTCONN ソケットは接続モードですが、接続されていません。
ENOTSOCK Socket パラメーターは、ソケットではなくファイルを参照します。
EOPNOTSUPP Socket 引数は、 Flags パラメーターに設定された 1 つ以上の値をサポートしないソケットに関連付けられています。
EPIPE 接続されたソケットで送信しようとしましたが、リモート・ピアまたは接続のソケット・サイドのいずれかによって接続がシャットダウンされました。 ソケットのタイプが SOCK_ ストリームの場合、呼び出しプロセスに対して シGPIPE シグナルが生成されます。
EWOULDBLOCK ソケットは nonblockingとしてマークされ、受け入れられる接続は存在しません。