sendto() - ソケットに関するデータの送信
標準
標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
XPG4.2 |
両方 |
形式
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>
ssize_t sendto(int socket, const void *buffer, size_t length, int flags,
const struct sockaddr *address, size_t address_len);
#define _OE_SOCKETS
#include <sys/socket.h>
int sendto(int socket, char *buffer, int length, int flags,
struct sockaddr *address, int address_len);
機能説明
- パラメーター
- 説明
- socket
- ソケット記述子。
- buffer
- 送信するメッセージが入っているバッファーへのポインター。
- length
- msg パラメーターによって指されたバッファー内のメッセージの長さ。
- flags
- これらのフラグの設定は、AF_UNIX ドメインではサポートされません。以下のフラグが使用可能です。
- MSG_OOB
- ソケット上のアウト・オブ・バンドのデータを送信します。アウト・オブ・バンドのデータをサポートするのは、SOCK_STREAM ソケットのみです。アウト・オブ・バンドのデータは、単一バイトです。
アウト・オブ・バンドのデータが、2 つのプログラム間で送信される前に、いくらか調整を図る必要があります。データをインライン で読み取るつもりではない場合には、アウト・オブ・バンドのデータの受信側 は、アウト・オブ・バンドのデータの送信時に生成される SIGURG シグナル の受信側を指定する必要があります。受信側が設定されていないと、シグナルは送信されません。受信側は、fcntl() コマンドの F_SETOWN オペランドを使用することによりセットアップされます。このコマンドは、pid または gid のどちらかを指定します。 このオペランドの詳細については、fcntl() コマンドを参照してください。
データの受信側は、アウト・オブ・バンドのデータをインラインで受け取るか、あるいは setsockopt() の SO_OOBINLINE オプションの設定により、インラインで受け取らないかどうかを判別します。アウト・オブ・バンドのデータの受信の詳細は、setsockopt()、 recv()、recvfrom()、および recvmsg() コマンドを参照してください。
- MSG_DONTROUTE
- この操作の間、SO_DONTROUTE オプションはオンになっています。これは通常、診断またはルーティング・プログラムだけしか使用しません。
- address
- ターゲットのアドレス。
- addr_len
- address が指すアドレスのサイズ。
送信するソケット・データを保留するのに使用可能な バッファー・スペースが十分でなく、ソケットがブロック・モードに なっている場合には、sendto() は追加の バッファー・スペースが使用可能になるまで呼び出し元をブロック します。ソケットが非ブロック・モードの場合には、sendto() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。
データグラム・ソケットの場合、データグラムが TCP/IP バッファーに適合すれば、この呼び出しはデータグラム全体を送信します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーションで 1000 バイトを送信したい場合には、この関数へのそれぞれの呼び出しによって、1 バイト、または 10 バイト、あるいは 1000 バイト全体が送信できます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しを ループに入れて、すべてのデータが送信されてしまうまで、この関数を呼び出す 必要があります。
IPv6 用ソケット・アドレス構造体: sockaddr_in6 構造体は netinit/in.h ヘッダーに追加されます。 これは、IPv6 特定アドレスの、アプリケーションとシステムの間のパスに使用されます。
C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。
戻り値
正常に実行された場合、sendto() は送信された文字数を戻します。
0 またはそれより大きい値は、送信されたバイト数を示していますが、これはデータの送達が完了したことを保証するわけではありません。データの送達が完了していない場合は、ピア・ソケットおよびあとで生成された SIGPIPE シグナルを使って接続を終了することができます。
送達する障害の指示は、データグラム・ソケットで使用したときに、この呼び出しの戻り値では暗黙ではありません。
- エラー・コード
- 説明
- EAFNOSUPPORT
- アドレス・ファミリーがサポートされていません (これは AF_UNIX または AF_INET ではありません)。
- EBADF
- socket が無効ソケット記述子です。
- ECONNREFUSED
- 接続する試みはリジェクトされました。
- ECONNRESET
- 接続はピアによって強制的にクローズされました。
- EFAULT
- msg および length パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
- EINTR
- データが送信される前に、シグナルが sendto() に割り込みました。
- EINVAL
- addr_len が、指定アドレス・ファミリーの有効アドレスのサイズではありません。
- EIO
- ネットワークまたはトランスポートで障害が発生しました。
- EMSGSIZE
- メッセージが大きすぎて、1 つのデータグラムとして送信されませんでした。デフォルトは、large-envelope-size です。(エンベロープが使用され、TCP/IP 処理中にデータグラムおよびフラグメントが 保持されます。2 KB より大きい UDP データグラムは、出力用に処理されている間、および入力でアプリケーション・プログラムによって受信されるのを待っている間、ラージ・エンベロープにより保持されます。)
- ENOBUFS
- メッセージの送信にバッファー・スペースを使用することができません。
- ENOTCONN
- ソケットが接続していません。
- ENOTSOCK
- 記述子はファイル用であり、ソケット用ではありません。
- EOPNOTSUPP
- flags で設定されている値 (1 つ以上) をサポートしていない socket 引数がソケットと関連付けられています。
- EPIPE
- 接続されたストリーム・ソケットの場合には、ピア・ソケット との接続が失われています。SIGPIPE シグナルが呼び出しプロセスに送信されます。
- EPROTOTYPE
- プロトコルのタイプが、このソケットには適切ではありません。SIGPIPE シグナルが呼び出しプロセスに送信されます。
- EWOULDBLOCK
- socket は非ブロック・モードであり、使用可能なデータ・バッファーがないか、バッファーが使用可能になる前に SO_SNDTIMEO タイムアウト値に達しました。
- エラー・コード
- 説明
- EACCES
- パス接頭部のコンポーネントに対する検索許可が拒否されているか、あるいは名前付きソケットへの書き込みアクセスが拒否されています。
- EIO
- ファイル・システムの読み取り中または書き込み中に、入出力エラーが発生しました。
- ELOOP
- ソケット・アドレスでのパス名の変換で見つかったシンボリック・リンクが 多すぎます。
- ENAMETOOLONG
- パス名のコンポーネントが NAME_MAX 文字を超えたか、あるいはパス名全体が PATH_MAX 文字を超えました。
- ENOENT
- パス名のコンポーネントに既存のファイル名が指定されていないか、またはパス名が空ストリングです。
- ENOTDIR
- ソケット・アドレスのパス名のパス接頭部のコンポーネントが、ディレクトリーでは ありません。
関連情報
- sys/socket.h — ソケット定義
- read() - ファイルまたはソケットからの読み取り
- readv() - ファイルまたはソケットのデータの読み取りとバッファー・セットへの保管
- recv() - ソケット上のデータの受信
- recvfrom() - ソケット上のメッセージの受信
- recvmsg() - ソケット上のメッセージの受信およびメッセージ・ヘッダーの配列への保管 select()、pselect() - ファイルまたはソケットおよびメッセージ・キューに関するアクティビティーのモニター
- send() - ソケットに関するデータの送信
- sendmsg() - ソケットに関するメッセージの送信
- socket() - ソケットの作成
- write() - ファイルまたはソケットへのデータの書き込み
- writev() - 配列からファイルまたはソケットへのデータの書き込み