Win32 API 日本語リファレンス
ホーム › Networking.WinSock › LPFN_TRANSMITPACKETS

LPFN_TRANSMITPACKETS

コールバック

シグネチャ

BOOL LPFN_TRANSMITPACKETS(
    SOCKET hSocket,
    TRANSMIT_PACKETS_ELEMENT* lpPacketArray,
    DWORD nElementCount,
    DWORD nSendSize,
    OVERLAPPED* lpOverlapped,
    DWORD dwFlags
);

パラメーター

フィールド型説明
hSocketSOCKET送信に使用する、接続済みソケットのハンドル。ソケットはコネクション指向の回線である必要はありませんが、既定の宛先/ピアが connect、 WSAConnect、 accept、 WSAAccept、 AcceptEx、または WSAJoinLeaf 関数によって確立されている必要があります。
lpPacketArrayTRANSMIT_PACKETS_ELEMENT*送信するデータを記述する、TRANSMIT_PACKETS_ELEMENT 型の配列。
nElementCountDWORDlpPacketArray 内の要素数。
nSendSizeDWORD

send 操作で使用されるデータブロックのサイズ(バイト単位)。nSendSize に 0 を設定すると、ソケット層が既定の send サイズを選択します。

nSendSize に 0xFFFFFFF を設定すると、呼び出し側が各 send 要求のサイズと内容を制御できます。これは、lpPacketArray パラメーターが指す TRANSMIT_PACKETS_ELEMENT 配列で TP_ELEMENT_EOP フラグを使用することで実現します。この機能は、個々の send 要求のサイズに制限があるメッセージプロトコルで役立ちます。

lpOverlappedOVERLAPPED*OVERLAPPED 構造体へのポインター。hSocket パラメーターに指定したソケットハンドルがオーバーラップとして開かれている場合、このパラメーターを使用して非同期(オーバーラップ)I/O 操作を行えます。ソケットハンドルは既定でオーバーラップとして開かれます。
dwFlagsDWORD

TransmitPackets 関数の処理をカスタマイズするために使用するフラグのセット。次の表に dwFlags パラメーターの用途を示します。

値 意味
TF_DISCONNECT
すべてのファイルデータが送信用にキューへ入れられた後、トランスポートレベルの切断を開始します。コネクション指向のソケットにのみ適用されます。切断のセマンティクスをサポートしないソケット(データグラムソケットなど)にこのフラグを指定すると、エラーになります。
TF_REUSE_SOCKET
ソケットハンドルを再利用できるように準備します。 TransmitPackets 関数が完了すると、そのソケットハンドルを AcceptEx 関数に渡すことができます。コネクション指向のソケットで TF_DISCONNECT を指定した場合にのみ有効です。
Note ソケットレベルのパケット送信は、基盤となるトランスポートの動作に左右されます。たとえば TCP ソケットでは TCP の TIME_WAIT 状態の影響を受け、TransmitPackets の呼び出しが遅延することがあります。
TF_USE_DEFAULT_WORKER
時間のかかる TransmitPackets 要求の処理に、システムの既定のスレッドを使用するよう Winsock に指示します。時間のかかる TransmitPackets 要求とは、ファイルまたはキャッシュからの読み取りが 1 回では済まない要求を指します。したがって、その判定はファイルのサイズと指定された送信パケット長に依存します。

システムの既定のスレッドは、次のレジストリパラメーターを REG_DWORD として使用することで調整できます:HKEY_LOCAL_MACHINE\CurrentControlSet\Services\AFD\Parameters\TransmitWorker

TF_USE_SYSTEM_THREAD
時間のかかる TransmitPackets 要求の処理に、システムスレッドを使用するよう Winsock に指示します。時間のかかる TransmitPackets 要求とは、ファイルまたはキャッシュからの読み取りが 1 回では済まない要求を指します。したがって、その判定はファイルのサイズと指定された送信パケット長に依存します。
TF_USE_KERNEL_APC
時間のかかる TransmitPackets 要求の処理に、ワーカースレッドではなくカーネルの Asynchronous Procedure Calls(APC)を使用するよう Winsock に指示します。時間のかかる TransmitPackets 要求とは、ファイルまたはキャッシュからの読み取りが 1 回では済まない要求を指します。したがって、その判定はファイルのサイズと指定された送信パケット長に依存します。詳細については「解説」を参照してください。

公式ドキュメント

TransmitPackets 関数は、接続済みのソケットを介してメモリ内のデータまたはファイルのデータを送信します。 TransmitPackets 関数は、オペレーティングシステムのキャッシュマネージャーを使用してファイルデータを取得し、送信に必要な最小限の時間だけメモリをロックするため、効率的で高性能な転送を実現します。

Note この関数は、Windows Sockets 仕様に対する Microsoft 固有の拡張です。

戻り値

TransmitPackets 関数が成功した場合、戻り値は TRUE です。それ以外の場合、戻り値は FALSE です。拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。エラーコード WSA_IO_PENDING または ERROR_IO_PENDING は、オーバーラップ操作が正常に開始され、完了が後で通知されることを示します。それ以外のエラーコードは、オーバーラップ操作が正常に開始されず、完了通知も行われないことを示します。この場合、アプリケーションは ERROR_IO_PENDING と WSA_IO_PENDING のいずれも処理する必要があります。

戻り値 説明
WSAECONNABORTED
確立されていた接続が、ホストコンピューター上のソフトウェアによって中止されました。このエラーは、タイムアウトやその他の障害により仮想回線が終了した場合に返されます。
WSAECONNRESET
既存の接続がリモートホストによって強制的に閉じられました。このエラーは、ストリームソケットでリモート側によって仮想回線がリセットされた場合に返されます。そのソケットは使用できなくなるため、アプリケーションはソケットを閉じる必要があります。
WSAEFAULT
呼び出しでポインター引数を使用しようとした際に、システムが無効なポインターアドレスを検出しました。このエラーは、lpPacketArray または lpOverlapped パラメーターがユーザーアドレス空間の有効な領域内に完全には収まっていない場合に返されます。
WSAEINVAL
無効な引数が指定されました。このエラーは、dwFlags パラメーターに TF_REUSE_SOCKET フラグが設定されているにもかかわらず、TF_DISCONNECT フラグが設定されていない場合に返されます。また、lpOverlapped が指す OVERLAPPED 構造体で指定されたオフセットがファイルの範囲内にない場合にも返されます。さらに、送信するバイトの合計数が 2,147,483,646(32 ビット整数の最大値から 1 を引いた値)を超える場合にも返されます。
WSAENETDOWN
ソケット操作が停止したネットワークを検出しました。このエラーは、ネットワークサブシステムに障害が発生した場合に返されます。
WSAENETRESET
操作の進行中にキープアライブ動作が障害を検出したため、接続が切断されました。このエラーは、キープアライブ動作が障害を検出して接続が切断されたストリームソケットに対して返されます。
WSAENOBUFS
システムに十分なバッファー領域がなかったか、キューがいっぱいであったため、ソケットに対する操作を実行できませんでした。このエラーは、Windows Sockets プロバイダーがバッファーのデッドロックを報告した場合にも返されます。
WSAENOTCONN
ソケットが接続されていないため、データの送信または受信の要求が許可されませんでした。このエラーはストリームソケットに対して返されます。
WSAENOTSOCK
ソケットではないものに対して操作が試みられました。このエラーは、hSocket パラメーターがソケットでない場合に返されます。
WSAESHUTDOWN
以前の shutdown 呼び出しによってソケットがその方向へ既にシャットダウンされていたため、データの送信または受信の要求が許可されませんでした。このエラーは、ストリームソケットが送信方向にシャットダウンされている場合に返されます。how パラメーターに SD_SEND または SD_BOTH を設定して shutdown 関数をソケットに対して呼び出した後は、そのストリームソケットで TransmitFile を呼び出すことはできません。
WSANOTINITIALISED
アプリケーションが WSAStartup 関数を呼び出していないか、WSAStartup が失敗しました。TransmitFile 関数を使用する前に、 WSAStartup の呼び出しが成功している必要があります。
WSA_IO_PENDING
オーバーラップ I/O 操作が進行中です。この値は、オーバーラップ I/O 操作が正常に開始された場合に返され、完了が後で通知されることを示します。
WSA_OPERATION_ABORTED
スレッドの終了またはアプリケーションの要求により、I/O 操作が中止されました。このエラーは、ソケットが閉じられたこと、 WSAIoctl で "SIO_FLUSH" コマンドが実行されたこと、またはオーバーラップ要求を開始したスレッドが操作の完了前に終了したことにより、オーバーラップ操作が取り消された場合に返されます。
Note あるスレッドが開始したすべての I/O は、そのスレッドが終了すると取り消されます。オーバーラップソケットでは、非同期操作が完了する前にスレッドが閉じられると、保留中の非同期操作が失敗することがあります。詳細については、ExitThread を参照してください。

解説(Remarks)

TransmitPackets 関数は、使用するオペレーティングシステムに応じて最適化されています。

TransmitPackets 関数の 1 回の呼び出しで送信できる最大バイト数は、2,147,483,646(32 ビット整数の最大値から 1 を引いた値)です。2,147,483,646 バイトを超えるデータを送信する必要がある場合は、1 回の呼び出しで転送するバイト数が 2,147,483,646 を超えないようにして、TransmitPackets 関数を複数回呼び出します。

Note TransmitPackets 関数の関数ポインターは、実行時に SIO_GET_EXTENSION_FUNCTION_POINTER オペコードを指定して WSAIoctl 関数を呼び出して取得する必要があります。WSAIoctl 関数に渡す入力バッファーには、TransmitPackets 拡張関数を識別する値を持つグローバル一意識別子(GUID)である WSAID_TRANSMITPACKETS を格納する必要があります。成功した場合、WSAIoctl 関数が返す出力には TransmitPackets 関数へのポインターが格納されます。WSAID_TRANSMITPACKETS GUID は、Mswsock.h ヘッダーファイルで定義されています。

Windows Server 2003 で TransmitPackets 関数を使用すると、より良いパフォーマンスが期待できます。

lpOverlapped が NULL でない場合、 TransmitPackets 関数が戻る前にオーバーラップ I/O が完了しないことがあります。この場合、 TransmitPackets 関数は失敗を返し、 WSAGetLastError 関数は ERROR_IO_PENDING を返します。これにより、呼び出し側は送信が完了するまでの間も処理を続行できます。

Note あるスレッドが開始したすべての I/O は、そのスレッドが終了すると取り消されます。オーバーラップソケットでは、操作が完了する前にスレッドが閉じられると、保留中の非同期操作が失敗することがあります。詳細については ExitThread を参照してください。
TransmitPackets 関数が TRUE を返した場合、または FALSE を返して WSAGetLastError が ERROR_IO_PENDING を返した場合、Windows は OVERLAPPED 構造体の hEvent メンバーで指定されたイベント、または hSocket で指定されたソケットをシグナル状態に設定し、完了時にはそのソケットに関連付けられた完了ポートに通知を配信します。最終的な状態と送信されたバイト数を取得するには、 GetOverlappedResult、 WSAGetOverlappedResult、または GetQueuedCompletionStatus を使用します。

TransmitPackets と非同期プロシージャ呼び出し(APC)

TF_USE_KERNEL_APC フラグを使用すると、パフォーマンスが大きく向上する場合があります。 TransmitPackets 関数の呼び出しを開始したスレッドが重い計算処理に使用されている場合、可能性は低いものの、APC が起動されなくなることがあります。

Note カーネル APC とユーザーモード APC には次の違いがあります。
  • カーネル APC は、スレッドが待機状態にあるときに起動します。
  • ユーザーモード APC は、スレッドがアラート可能な待機状態にあるときに起動します。
Windows Phone 8: この関数は、Windows Phone 8 以降の Windows Phone ストアアプリでサポートされています。

Windows 8.1 および Windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストアアプリでサポートされています。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)