send

send関数は接続されたソケット上にデータを送信します。

int send(
    SOCKET s,            // socket discriptor
    const char* buf,     // data buffer
    int len,             // data length
    int flags            // flags
);

WS2_32.DLL

引数

s

接続されたソケットを識別するディスクリプタを指定します。

buf

送信するデータを含むバッファのポインタを指定します。

len

bufパラメータが指すバッファのデータの長さをバイト単位で指定します。

flags

呼び出しをどのように行うかを指定するフラグを指定します。このパラメータは、0または以下の値のビット論理和で構成されます。

1 (MSG_OOB)
OOBデータを送信します(SOCK_STREAMなどのストリーム形式のソケットでのみ有効)。

4 (MSG_DONTROUTE)

データがルーティングされないようにすることを指定します。Windows Socketsサービスプロバイダは、このフラグを無視するかどうかを選択することができます。

戻り値

成功すると、送信されたデータの総バイト数を返します。この値はlenパラメータで指定された送信要求の長さよりも小さくなる可能性があります。

失敗すると-1 (SOCKET_ERROR) を返します。特定のエラーコードを取得するにはWSAGetLastError関数を呼び出します。

10004 (WSAEINTR)

(ブロッキング)Windows Sockets 1.1呼び出しがWSACancelBlockingCallによりキャンセルされました。

10013 (WSAEACCES)

要求されたアドレスはブロードキャストアドレスですが、適切なフラグがセットされていませんでした。SO_BROADCASTソケットオプションを指定してsetsockopt関数を呼び出し、ブロードキャストアドレスの使用を有効にしなければなりません。

10014 (WSAEFAULT)

bufパラメータは、ユーザアドレス空間の有効な部分に含まれていません。

10035 (WSAEWOULDBLOCK)

ソケットが非ブロッキングとしてマークされていますが、linger構造体のl_onoffメンバにゼロ以外の値が設定され、かつlinger構造体のl_lingerメンバがゼロ以外のタイムアウト値が設定されています。

10036 (WSAEINPROGRESS)

ブロッキングWindows Sockets 1.1呼び出しが実行中であるか、サービスプロバイダがコールバック関数を実行中です。

10038 (WSAENOTSOCK)

指定されたディスクリプタはソケットではありません。

10045 (WSAEOPNOTSUPP)

以下のいずれかのソケットに対してMSG_OOBが指定されました。

10050 (WSAENETDOWN)

ネットワークサブシステムが失敗しました。

10052 (WSAENETRESET)

操作を進行中にkeep-aliveアクティビティが障害を検出したために接続が破棄されました。

10055 (WSAENOBUFS)

バッファ領域が利用可能ではありません。

10057 (WSAENOTCONN)

ソケットは接続されていません。

10058 (WSAESHUTDOWN)

指定されたソケットはシャットダウンされています。SD_SENDまたはSD_BOTHを指定してshutdown関数を呼び出した後では、そのソケットに送信することはできません。

10093 (WSANOTINITIALISED)

この関数を呼び出す前にWSAStartup関数の呼び出しが成功していなければなりません。

10040 (WSAEMSGSIZE)

ソケットはメッセージ指向ですが、メッセージサイズが下層のトランスポートによってサポートされている最大サイズよりも大きいです。

10065 (WSAEHOSTUNREACH)

現時点では、このホストからリモートホストへ到達できません。

10104 (WSAEINVAL)

以下のいずれかのエラーが発生しました。

10053 (WSAECONNABORTED)

仮想通信路がタイムアウトまたは他のエラーにより終了しました。そのソケットはもはや使用することができないので、アプリケーションはソケットをクローズするべきです。

10054 (WSAECONNRESET)

リモート側がhardクローズまたはabortiveクローズを実行したことにより、仮想通信路がリセットされました。UDPソケットの場合、リモートホストは以前に送信されたUDPデータグラムを配信することができずに、「ポート不到達」ICMPパケット応答を返しました。そのソケットはもはや使用することができないので、アプリケーションはソケットをクローズするべきです。

10060 (WSAETIMEDOUT)

ネットワークのエラーのため、または相手側のシステムが通知なくダウンしたために、接続が破棄されました。

解説

send関数は送信データを接続されたソケットに書き出すのに使用されます。

メッセージ指向のソケット(例えば、アドレスファミリがAF_INETまたはAF_INET6、ソケットタイプがSOCK_DGRAM、かつプロトコルがIPPROTO_UDPの場合)では、下層のプロバイダの最大パケットサイズを超過しないように注意しなくてはなりません。プロバイダに対する最大メッセージパケットサイズは、getsockopt関数のoptnameパラメータにSO_MAX_MSG_SIZEを指定してソケットオプションの値を読み出することで取得することができます。データが長すぎて下層プロトコルを通してアトミックに渡すことができない場合、データは送信されずにWSAEMSGSIZEエラーが返されます。

send関数の正常な完了は、データが正常に配送されて受信側に到達したことを表すものではありません。この関数は、データが正常に送信されたことのみを示します。

伝送されるデータを保持するためにトランスポートシステム内で利用可能なバッファ領域がない場合、ソケットが非ブロッキングモードでない限りsend関数はブロックします。非ブロッキングのストリーム指向ソケットでは、クライアント及びサーバコンピュータの両方のバッファ空き容量に応じて、書き込みバイト数は1以上かつ要求された長さ以下の値になる可能性があります。select関数、WSAEventSelect関数、WSAEventSelect関数を使用して、さらにデータを送信することができる時を決定することができます。

lenパラメータに0を指定してsend関数を呼び出すことができ、実装により成功として扱われます。このような場合は、send関数は有効な値として0を返します。メッセージ指向のソケットでは、長さゼロのトランスポートダイアグラムが送信されます。

flagsパラメータを使用することにより、関連付けられたソケットに対して指定されているソケットオプションに優先して、関数の振る舞いに作用させることができます。send関数のセマンティックスは、sパラメータに指定されたソケットに対して以前にセットされたオプションとsend関数に渡されるflagsパラメータによって決定されます。

対応情報

Windows 95 以降 / Windows NT 3.1 以降