sendmsg サブルーチン

目的

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

ライブラリー

標準 C ライブラリー (libc.a)

構文

#include <sys/types.h>
#include <sys/socketvar.h>
#include <sys/socket.h>
int sendmsg ( Socket,  Message,  Flags)
int Socket;
const struct msghdr Message [ ];
int Flags;

説明

sendmsg サブルーチンは、 msghdr メッセージ構造体を使用して、接続されたソケットまたは接続されていないソケットを介してメッセージを送信します。 /usr/include/sys/socket.h ファイルには、 msghdr 構造体が入っており、構造体メンバーを定義します。 BSD 4.4では、 msghdr メッセージ構造体のサイズとメンバーが変更されました。 古い構造を開始したいアプリケーションは、 COMPAT_43 を定義してコンパイルする必要があります。 デフォルトの動作は BSD 4.4の動作です。

ソケットでブロードキャストするには、アプリケーション・プログラムはまず SO_BROADCAST オプションを使用して setsockopt サブルーチンを発行し、ブロードキャスト許可を取得する必要があります。

sendmsg サブルーチンは、15 個のメッセージ・エレメントのみをサポートします。

sendmsg サブルーチンを含むすべてのアプリケーションは、特定の値に設定された _BSD マクロを使用してコンパイルする必要があります。 許容値は 43 および 44 です。 さらに、すべてのソケット・アプリケーションに BSD libbsd.a ライブラリーを組み込む必要があります。

sendmsg ルーチンは、Advanced Sockets API for IPv6で定義されている IPv6 補助データ・エレメントをサポートします。

パラメーター

項目 説明
ソケット ソケット記述子を指定します。
Message 送信されるメッセージを含む msghdr メッセージ構造体を指します。
flags 送信側がメッセージ伝送を制御できるようにします。 sys/socket.h ファイルには、 Flags パラメーターが入っています。 呼び出しを送信するために使用される Flags パラメーターは、以下の値のいずれかまたは両方を論理 OR 演算することによって形成されます。
MSG_OOB
SOCK_STREAMをサポートするソケット上のアウト・オブ・バンド・データを処理します。
注: 以下の値は、汎用ではありません。 これは、プログラムのデバッグまたはルーティングに使用される管理ツールです。
MSG_DONTROUTE
ルーティング・テーブルを使用せずに送信します。
MSG_MPEG2
このブロックが MPEG2 ブロックであることを示します。 これは、 SOCK_CONN_DGRAM タイプのソケットにのみ適用されます。

戻り値

正常終了すると、 sendmsg サブルーチンは送信された文字数を戻します。

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

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

エラー・コード

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

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