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

標準

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

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

両方  

形式

X/Open:
#define _XOPEN_SOURCE_EXTENDED 1
#include <sys/socket.h>

ssize_t send(int socket, const void *buffer, size_t length, int flags);
バークレー・ソケット:
#define _OE_SOCKETS
#include <sys/socket.h>

int send(int socket, char *buffer, int length, int flags);

機能説明

send() 関数で、記述子が socket の ソケット上のデータが送信されます。send() 呼び出しは、すべての接続ソケットに適用されます。
パラメーター
説明
socket
ソケット記述子。
msg
送信するメッセージが入っているバッファーへのポインター。
length
msg パラメーターで示される、メッセージの長さ。
flags
複数のフラグを指定した場合には、flags パラメーターを設定し、論理 OR 演算子 (|) を使用してこれらを分離する必要があります。
MSG_OOB

この概念をサポートする、ソケット上のアウト・オブ・バンドのデータを送信します。アウト・オブ・バンドのデータをサポートするのは、SOCK_STREAM ソケットのみです。アウト・オブ・バンドのデータは、単一バイトです。

アウト・オブ・バンドのデータが、2 つのプログラム間で送信される前に、いくらか調整を図る必要があります。データをインライン で読み取るつもりではない場合には、アウト・オブ・バンドのデータの受信側 は、アウト・オブ・バンドのデータの送信時に生成される SIGURG シグナル の受信側を指定する必要があります。受信側が設定されていないと、シグナルは送信されません。受信側は、fcntl コマンドの F_SETOWN オペランドを使用することにより設定されます。このコマンドは、pid または gid のどちらかを指定します。このオペランドの詳細は、fcntl コマンドを参照してください。

データの受信側は、アウト・オブ・バンドのデータをインラインで受け取るか、あるいは setsockopt() の SO_OOBINLINE オプションの設定により、インラインで受け取らないかどうかを判別します。アウト・オブ・バンドのデータの受信の詳細は、setsockopt()、 recv()、recvfrom()、および recvmsg() コマンドを参照してください。

MSG_DONTROUTE
この操作の間、SO_DONTROUTE オプションはオンになっています。これは通常、診断またはルーティング・プログラムだけしか使用しません。

送信するソケット・データを保留するのに使用可能な バッファー・スペースが十分でなく、ソケットがブロック・モードに なっている場合には、send() は追加の バッファー・スペースが使用可能になるまで呼び出し元をブロック します。ソケットが非ブロック・モードの場合には、send() は -1 を戻し、エラー・コードを EWOULDBLOCK に設定します。非ブロッキング・モードの設定方法の説明については、fcntl() - オープン・ファイル記述子の制御または ioctl() - 装置の制御を参照してください。

データグラム・ソケットの場合、データグラムが TCP/IP バッファーに適合すれば、この呼び出しはデータグラム全体を送信します。ストリーム・ソケットは、データを分離する境界のない情報ストリームのように動作します。例えば、アプリケーションで 1000 バイトを送信したい場合には、この関数へのそれぞれの呼び出しによって、1 バイト、または 10 バイト、あるいは 1000 バイト全体が送信できます。したがって、ストリーム・ソケットを使用するアプリケーションは、この呼び出しを ループに入れて、すべてのデータが送信されてしまうまで、この関数を呼び出す 必要があります。

C++ の特殊な動作: この関数を C++ で使用するには、_XOPEN_SOURCE_EXTENDED 1 フィーチャー・テスト・マクロを使用する必要があります。

戻り値

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

正常に実行されなかった場合、send() は、ローカルで検出されたエラーを示す -1 を戻して、errno を次のいずれかの値に設定します。送達する障害の指示は、send() ルーチンでは暗黙ではありません。
エラー・コード
説明
EBADF
socket が無効ソケット記述子です。
ECONNRESET
接続はピアによって強制的にクローズされました。
EDESTADDRREQ
ソケットは接続目的でないため、ピア・アドレスは設定されません。
EFAULT
msg および length パラメーターを使用すると、呼び出し元のアドレス・スペースの外側のストレージにアクセスすることになります。
EINTR
データが送信される前に、シグナルが send() に割り込みました。
EIO
ネットワークまたはトランスポートで障害が発生しました。
EMSGSIZE
メッセージが大きすぎて、1 つのデータグラムとして送信されませんでした。
ENOBUFS
メッセージの送信にバッファー・スペースを使用することができません。
ENOTCONN
ソケットが接続していません。
ENOTSOCK
記述子はファイル用であり、ソケット用ではありません。
EOPNOTSUPP
flags で設定されている値 (1 つ以上) をサポートしていない socket 引数がソケットと関連付けられています。
EPIPE
接続されたストリーム・ソケットの場合には、ピア・ソケット との接続が失われています。SIGPIPE シグナルが呼び出しプロセスに送信されます。
EWOULDBLOCK
socket は非ブロック・モードであり、使用可能なデータ・バッファーがないか、バッファーが使用可能になる前に SO_SNDTIMEO タイムアウト値に達しました。