LPFN_TRANSMITPACKETS
コールバックシグネチャ
BOOL LPFN_TRANSMITPACKETS(
SOCKET hSocket,
TRANSMIT_PACKETS_ELEMENT* lpPacketArray,
DWORD nElementCount,
DWORD nSendSize,
OVERLAPPED* lpOverlapped,
DWORD dwFlags
);パラメーター
| フィールド | 型 | 説明 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| hSocket | SOCKET | 送信に使用する、接続済みソケットのハンドル。ソケットはコネクション指向の回線である必要はありませんが、既定の宛先/ピアが connect、 WSAConnect、 accept、 WSAAccept、 AcceptEx、または WSAJoinLeaf 関数によって確立されている必要があります。 | ||||||||||||
| lpPacketArray | TRANSMIT_PACKETS_ELEMENT* | 送信するデータを記述する、TRANSMIT_PACKETS_ELEMENT 型の配列。 | ||||||||||||
| nElementCount | DWORD | lpPacketArray 内の要素数。 | ||||||||||||
| nSendSize | DWORD | send 操作で使用されるデータブロックのサイズ(バイト単位)。nSendSize に 0 を設定すると、ソケット層が既定の send サイズを選択します。 nSendSize に 0xFFFFFFF を設定すると、呼び出し側が各 send 要求のサイズと内容を制御できます。これは、lpPacketArray パラメーターが指す TRANSMIT_PACKETS_ELEMENT 配列で TP_ELEMENT_EOP フラグを使用することで実現します。この機能は、個々の send 要求のサイズに制限があるメッセージプロトコルで役立ちます。 | ||||||||||||
| lpOverlapped | OVERLAPPED* | OVERLAPPED 構造体へのポインター。hSocket パラメーターに指定したソケットハンドルがオーバーラップとして開かれている場合、このパラメーターを使用して非同期(オーバーラップ)I/O 操作を行えます。ソケットハンドルは既定でオーバーラップとして開かれます。 | ||||||||||||
| dwFlags | DWORD | TransmitPackets 関数の処理をカスタマイズするために使用するフラグのセット。次の表に dwFlags パラメーターの用途を示します。
|
公式ドキュメント
TransmitPackets 関数は、接続済みのソケットを介してメモリ内のデータまたはファイルのデータを送信します。 TransmitPackets 関数は、オペレーティングシステムのキャッシュマネージャーを使用してファイルデータを取得し、送信に必要な最小限の時間だけメモリをロックするため、効率的で高性能な転送を実現します。
戻り値
TransmitPackets 関数が成功した場合、戻り値は TRUE です。それ以外の場合、戻り値は FALSE です。拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。エラーコード WSA_IO_PENDING または ERROR_IO_PENDING は、オーバーラップ操作が正常に開始され、完了が後で通知されることを示します。それ以外のエラーコードは、オーバーラップ操作が正常に開始されず、完了通知も行われないことを示します。この場合、アプリケーションは ERROR_IO_PENDING と WSA_IO_PENDING のいずれも処理する必要があります。
| 戻り値 | 説明 |
|---|---|
| 確立されていた接続が、ホストコンピューター上のソフトウェアによって中止されました。このエラーは、タイムアウトやその他の障害により仮想回線が終了した場合に返されます。 | |
| 既存の接続がリモートホストによって強制的に閉じられました。このエラーは、ストリームソケットでリモート側によって仮想回線がリセットされた場合に返されます。そのソケットは使用できなくなるため、アプリケーションはソケットを閉じる必要があります。 | |
| 呼び出しでポインター引数を使用しようとした際に、システムが無効なポインターアドレスを検出しました。このエラーは、lpPacketArray または lpOverlapped パラメーターがユーザーアドレス空間の有効な領域内に完全には収まっていない場合に返されます。 | |
| 無効な引数が指定されました。このエラーは、dwFlags パラメーターに TF_REUSE_SOCKET フラグが設定されているにもかかわらず、TF_DISCONNECT フラグが設定されていない場合に返されます。また、lpOverlapped が指す OVERLAPPED 構造体で指定されたオフセットがファイルの範囲内にない場合にも返されます。さらに、送信するバイトの合計数が 2,147,483,646(32 ビット整数の最大値から 1 を引いた値)を超える場合にも返されます。 | |
| ソケット操作が停止したネットワークを検出しました。このエラーは、ネットワークサブシステムに障害が発生した場合に返されます。 | |
| 操作の進行中にキープアライブ動作が障害を検出したため、接続が切断されました。このエラーは、キープアライブ動作が障害を検出して接続が切断されたストリームソケットに対して返されます。 | |
| システムに十分なバッファー領域がなかったか、キューがいっぱいであったため、ソケットに対する操作を実行できませんでした。このエラーは、Windows Sockets プロバイダーがバッファーのデッドロックを報告した場合にも返されます。 | |
| ソケットが接続されていないため、データの送信または受信の要求が許可されませんでした。このエラーはストリームソケットに対して返されます。 | |
| ソケットではないものに対して操作が試みられました。このエラーは、hSocket パラメーターがソケットでない場合に返されます。 | |
| 以前の shutdown 呼び出しによってソケットがその方向へ既にシャットダウンされていたため、データの送信または受信の要求が許可されませんでした。このエラーは、ストリームソケットが送信方向にシャットダウンされている場合に返されます。how パラメーターに SD_SEND または SD_BOTH を設定して shutdown 関数をソケットに対して呼び出した後は、そのストリームソケットで TransmitFile を呼び出すことはできません。 | |
| アプリケーションが WSAStartup 関数を呼び出していないか、WSAStartup が失敗しました。TransmitFile 関数を使用する前に、 WSAStartup の呼び出しが成功している必要があります。 | |
| オーバーラップ I/O 操作が進行中です。この値は、オーバーラップ I/O 操作が正常に開始された場合に返され、完了が後で通知されることを示します。 | |
|
スレッドの終了またはアプリケーションの要求により、I/O 操作が中止されました。このエラーは、ソケットが閉じられたこと、
WSAIoctl で "SIO_FLUSH" コマンドが実行されたこと、またはオーバーラップ要求を開始したスレッドが操作の完了前に終了したことにより、オーバーラップ操作が取り消された場合に返されます。
Note あるスレッドが開始したすべての I/O は、そのスレッドが終了すると取り消されます。オーバーラップソケットでは、非同期操作が完了する前にスレッドが閉じられると、保留中の非同期操作が失敗することがあります。詳細については、ExitThread を参照してください。
|
解説(Remarks)
TransmitPackets 関数は、使用するオペレーティングシステムに応じて最適化されています。
- Windows のサーバーエディションでは、 TransmitPackets 関数は高いパフォーマンスが得られるように最適化されています。
- Windows のクライアントエディションでは、 TransmitPackets 関数はメモリとリソースの使用量が最小になるように最適化されています。
TransmitPackets 関数の 1 回の呼び出しで送信できる最大バイト数は、2,147,483,646(32 ビット整数の最大値から 1 を引いた値)です。2,147,483,646 バイトを超えるデータを送信する必要がある場合は、1 回の呼び出しで転送するバイト数が 2,147,483,646 を超えないようにして、TransmitPackets 関数を複数回呼び出します。
Windows Server 2003 で TransmitPackets 関数を使用すると、より良いパフォーマンスが期待できます。
lpOverlapped が NULL でない場合、 TransmitPackets 関数が戻る前にオーバーラップ I/O が完了しないことがあります。この場合、 TransmitPackets 関数は失敗を返し、 WSAGetLastError 関数は ERROR_IO_PENDING を返します。これにより、呼び出し側は送信が完了するまでの間も処理を続行できます。
TransmitPackets と非同期プロシージャ呼び出し(APC)
TF_USE_KERNEL_APC フラグを使用すると、パフォーマンスが大きく向上する場合があります。 TransmitPackets 関数の呼び出しを開始したスレッドが重い計算処理に使用されている場合、可能性は低いものの、APC が起動されなくなることがあります。
- カーネル APC は、スレッドが待機状態にあるときに起動します。
- ユーザーモード APC は、スレッドがアラート可能な待機状態にあるときに起動します。
Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされています。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)