SEND(2)

名前
send, sendto, sendmsg - ソケットへメッセージを送る

書式
#include <sys/types.h>
#include <sys/socket.h>

int send(int s, const void *msg, int len, unsigned int flags);

int sendto(int s, const void *msg, int len, unsigned int flags, const struct sockaddr *to, int tolen);

int sendmsg(int s, const struct msghdr *msg, unsigned int flags);

説明
警告: これは BSD のマン・ページ(man page)である。Linux 0.99.11 では sendmsg はインプリメントされていない。 send, sendto, sendmsg は他のソケット(socket)へメッセージを転送するのに使用する。 send はソケットが 接続された(connected) 状態にある場合にのみ使用できる。一方 sendto と sendmsg は何時でも使用できる。 目的地のアドレスは to とその大きさを指定する tolen で与えられる。メッセージの長さは len で与えられる。 もしメッセージが使用するプロトコル上を自動的に通過するには長過ぎる場合、 EMSGSIZE エラーが返され、メッセージは転送されない。 send での配送の失敗の明示的に示されない。 ローカルに発見されたエラーは -1 を返すことによって指摘される。 もしメッセージを転送するための十分なメッセージ空間がソケットに ない場合には、 send は通常はソケットが非停止(non-blocking) I/O モードでなければ停止(block)する。 さらにデータを送ることが可能かどうかを調べるために select(2) コールを使用することができる。 flags パラメーターは以下のいくつかを含んでいてもよい。
    #define	MSG_OOB        0x1  /* process out-of-band data */
    #define	MSG_DONTROUTE  0x4  /* bypass routing, use direct interface */
MSG_OOB フラグは 帯域外(out-of-band) データをサポートするソケット(例えば SOCK_STREAM )に 帯域外 データを送るのに使用する。下位プロトコルも 帯域外 データをサポートしている必要がある。 MSG_DONTROUTE は大抵は診断やルーティング・プログラムによってのみ使用される。 msghdr 構造体の内容については recv(2) を参照せよ。

返り値
このコールは送ったキャラクターの数を返す。エラーが起こった場合は -1 が返される。

エラー

EBADF
    無効なディスクリプター(descriptor)が指定された。

ENOTSOCK
    引き数 s がソケットでない。

EFAULT
    ユーザー空間として不正なアドレスがパラメーターとして指定された。

EMSGSIZE
    ソケットがメッセージを自動的に転送するように求められたが、メッセージが 大き過ぎるために送信が不可能である。

EWOULDBLOCK
    ソケットが非停止(non-blocking)に設定されており、 要求された操作が停止(block)した。

ENOBUFS
    システムが内部バッファーの割当てをできなかった。 バッファーが使えるようになればこの操作は成功するだろう。

ENOBUFS
    ネットワーク・インターフェースのための出力キュー(queue)が一杯である。 これは一般に一時的な輻輳(congestion)のためにインターフェースが 送信を止めていることを意味する。

準拠
4.4BSD, SVr4 (これらの関数コールは 4.2BSD で最初に現われた。) SVr4 版には他に EINVAL, EINTR, EMSGSIZE, ENOSR, ENOMEM の エラー状態についての記述がある。

関連項目
fcntl(2), recv(2), select(2), getsockopt(2), socket(2), write(2)