sendto() - ソケットに関するデータの送信

標準

標準/拡張機能 C/C++ 依存項目

XPG4.2
Single UNIX Specification、バージョン 3

両方  

形式

X/Open:
#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);

機能説明

sendto() 関数で、記述子が socket の ソケット上のデータが送信されます。sendto() 呼び出しは、接続または非接続ソケットのどちらかに 適用されます。
パラメーター
説明
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() 関数は、拡張 ASCII の拡張機能のレベルに依存します。詳細は、拡張 ASCII サポートを参照してください。

戻り値

正常に実行された場合、sendto() は送信された文字数を戻します。

0 またはそれより大きい値は、送信されたバイト数を示していますが、これはデータの送達が完了したことを保証するわけではありません。データの送達が完了していない場合は、ピア・ソケットおよびあとで生成された SIGPIPE シグナルを使って接続を終了することができます。

送達する障害の指示は、データグラム・ソケットで使用したときに、この呼び出しの戻り値では暗黙ではありません。

正常に実行されなかった場合、sendto() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
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 タイムアウト値に達しました。
以下は、AF_UNIX 専用です。
エラー・コード
説明
EACCES
パス接頭部のコンポーネントに対する検索許可が拒否されているか、あるいは名前付きソケットへの書き込みアクセスが拒否されています。
EIO
ファイル・システムの読み取り中または書き込み中に、入出力エラーが発生しました。
ELOOP
ソケット・アドレスでのパス名の変換で見つかったシンボリック・リンクが 多すぎます。
ENAMETOOLONG
パス名のコンポーネントが NAME_MAX 文字を超えたか、あるいはパス名全体が PATH_MAX 文字を超えました。
ENOENT
パス名のコンポーネントに既存のファイル名が指定されていないか、またはパス名が空ストリングです。
ENOTDIR
ソケット・アドレスのパス名のパス接頭部のコンポーネントが、ディレクトリーでは ありません。