sendmsg サブルーチン
目的
メッセージ構造を使用してソケットからメッセージを送信します。
ライブラリー
標準 C ライブラリー (libc.a)
構文
説明
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 演算することによって形成されます。
注: 以下の値は、汎用ではありません。 これは、プログラムのデバッグまたはルーティングに使用される管理ツールです。
|
戻り値
正常終了すると、 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 | ソケットは非ブロッキングとしてマークされ、受け入れられる接続は存在しません。 |