CAsyncSocket::SendTo
更新 : 2007 年 11 月
指定した宛先にデータを送信します。
int SendTo(
const void* lpBuf,
int nBufLen,
UINT nHostPort,
LPCTSTR lpszHostAddress = NULL,
int nFlags = 0
);
int SendTo(
const void* lpBuf,
int nBufLen,
const SOCKADDR* lpSockAddr,
int nSockAddrLen,
int nFlags = 0
);
パラメータ
lpBuf
転送するデータを保持するバッファ。nBufLen
lpBuf 内のバイト単位のデータ長。nHostPort
ソケット アプリケーションを識別するポート。lpszHostAddress
オブジェクトを接続するソケットのネットワーク アドレス。"ftp.microsoft.com" のようなコンピュータ名、またはドットで区切られた "128.56.22.8" のような数字列。nFlags
呼び出し方法を指定します。この関数の意味は、ソケット オプションとパラメータ nFlags によって決まります。パラメータには C++ の OR 演算子を使って次の値の任意の組み合わせを指定できます。MSG_DONTROUTE データがルーティングに依存しないことを指定します。Windows ソケットの提供者は、このフラグを無視することもできます。
MSG_OOB 帯域外データを送信します (SOCK_STREAM 型のみ)。
lpSockAddr
宛先ソケットのアドレスを保持する SOCKADDR 構造体へのポインタ。nSockAddrLen
lpSockAddr 内のアドレス長。バイト単位で指定します。
戻り値
エラーが発生しなかった場合、SendTo は送信した文字総数を返します。この値は、nBufLen で指定した値よりも小さくなることもあります。それ以外の場合は SOCKET_ERROR 値を返します。固有のエラー コードは GetLastError を呼び出して取得できます。このメンバ関数では、次のエラーが発生します。
WSANOTINITIALISED この API を使う前に AfxSocketInit の呼び出しが正常終了していることが必要です。
WSAENETDOWN Windows ソケットの実装が、ネットワーク サブシステムの異常を検出しました。
WSAEACCES 要求したアドレスはブロードキャスト アドレスですが、適切なフラグが設定されていませんでした。
WSAEINPROGRESS 実行中の Windows ソケット呼び出しがブロッキングされています。
WSAEFAULT パラメータ lpBuf または lpSockAddr がユーザー アドレス空間の有効な部分を指していません。または、引数 lpSockAddr が小さすぎます。SOCKADDR 構造体のサイズより小さくなっています。
WSAEINVAL ホスト名が無効です。
WSAENETRESET Windows ソケットの実装が接続をドロップしたので、接続をリセットする必要があります。
WSAENOBUFS Windows ソケットの実装が、バッファのデッドロックをレポートしています。
WSAENOTCONN ソケットが接続されていません (SOCK_STREAM 型だけ)。
WSAENOTSOCK 記述子がソケットではありません。
WSAEOPNOTSUPP MSG_OOB が指定されましたが、SOCK_STREAM 型のソケットではありません。
WSAESHUTDOWN ソケットはシャットダウンしています。nHow に 1 または 2 を指定して ShutDown を起動した後では、ソケットで SendTo を呼び出すことはできません。
WSAEWOULDBLOCK ソケットは非ブロッキングになっていて、要求した操作がブロックされました。
WSAEMSGSIZE ソケットが SOCK_DGRAM 型で、Windows ソケットの実装でサポートされている最大長よりもデータグラムが長すぎます。
WSAECONNABORTED タイムアウトまたはその他の障害により、仮想回路はアボートされました。
WSAECONNRESET リモート側から仮想回路がリセットされました。
WSAEADDRNOTAVAIL 指定したアドレスはローカル コンピュータからは利用できません。
WSAEAFNOSUPPORT 指定したファミリのアドレスはこのソケットでは使用できません。
WSAEDESTADDRREQ 宛先アドレスが必要です。
WSAENETUNREACH 現時点では、このホストからネットワークに到達できません。
解説
SendTo は、データグラム ソケットまたはストリーム ソケットに出力データを書き込むために使います。データグラム ソケットが、サブネットの最大 IP パケット サイズを超えないように注意してください。データグラム ソケットのサイズは、AfxSocketInit が設定する WSADATA 構造体の要素 iMaxUdpDg で指定されます。データが長すぎると、プロトコルにそのまま渡されるため、WSAEMSGSIZE エラーが返され、データは送信されません。
SendTo が正常終了しても、データの受け渡しが成功したことを示しているわけではないことに注意してください。
SendTo は、パラメータ lpSockAddr で指定した特定のソケットにデータグラムを送信するために、SOCK_DGRAM ソケットだけで使います。
ブロードキャスト送信するには (SOCK_DGRAM のみ)、パラメータ lpSockAddr 内のアドレスをポート番号と共に、特別な IP アドレス INADDR_BROADCAST (Windows ソケットのヘッダー ファイル WINSOCK.H で定義されています) を使って構築します。また、パラメータ lpszHostAddress が NULL のときは、ソケットはブロードキャストとして構成されます。一般的に、断片化を発生させるサイズを超えるブロードキャスト データグラムはお勧めできません。データグラムのデータ部 (ヘッダーを除いた部分) が 512 バイトを超えないことをお勧めします。
IPv6 アドレスを処理するには、CAsyncSocket::SendToEx を使用します。
必要条件
ヘッダー : afxsock.h