LPWSPIOCTL
コールバックシグネチャ
INT LPWSPIOCTL(
SOCKET s,
DWORD dwIoControlCode,
void* lpvInBuffer,
DWORD cbInBuffer,
void* lpvOutBuffer,
DWORD cbOutBuffer,
DWORD* lpcbBytesReturned,
OVERLAPPED* lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
WSATHREADID* lpThreadId,
INT* lpErrno
);パラメーター
| フィールド | 型 | 説明 |
|---|---|---|
| s | SOCKET | ソケットを識別する記述子です。 |
| dwIoControlCode | DWORD | 実行する操作の制御コードです。 |
| lpvInBuffer | void* | 入力バッファーへのポインターです。 |
| cbInBuffer | DWORD | 入力バッファーのサイズ (バイト単位) です。 |
| lpvOutBuffer | void* | 出力バッファーへのポインターです。 |
| cbOutBuffer | DWORD | 出力バッファーのサイズ (バイト単位) です。 |
| lpcbBytesReturned | DWORD* | 実際の出力バイト数へのポインターです。 |
| lpOverlapped | OVERLAPPED* | WSAOverlapped 構造体へのポインターです (オーバーラップしないソケットでは無視されます)。 |
| lpCompletionRoutine | LPWSAOVERLAPPED_COMPLETION_ROUTINE | 操作が完了したときに呼び出される完了ルーチンへのポインターです (オーバーラップしないソケットでは無視されます)。「解説」を参照してください。 |
| lpThreadId | WSATHREADID* | プロバイダーが後続の WPUQueueApc 呼び出しで使用する WSATHREADID 構造体へのポインターです。プロバイダーは、WPUQueueApc 関数が返るまで、参照先の WSATHREADID 構造体 (ポインターではなく) を保持する必要があります。 |
| lpErrno | INT* | エラーコードへのポインターです。 |
公式ドキュメント
LPWSPIoctl 関数は、ソケットのモードを制御します。
戻り値
エラーが発生せず、操作がただちに完了した場合、LPWSPIoctl はゼロを返します。この場合、完了ルーチンが指定されていれば、すでにキューに登録されています。それ以外の場合は SOCKET_ERROR が返され、具体的なエラーコードは lpErrno から取得できます。エラーコード WSA_IO_PENDING は、オーバーラップ操作が正常に開始され、完了が後で通知されることを示します。それ以外のエラーコードは、オーバーラップ操作が開始されず、完了通知も発生しないことを示します。
| エラーコード | 意味 |
|---|---|
| WSA_IO_PENDING | オーバーラップ操作が正常に開始され、完了は後で通知されます。 |
| WSAEFAULT | lpvInBuffer、lpvOutBuffer、lpcbBytesReturned のいずれかのパラメーターが、ユーザーアドレス空間の有効な範囲に完全には含まれていません。または、cbInBuffer もしくは cbOutBuffer パラメーターが小さすぎます。 |
| WSAEINVAL | dwIoControlCode が有効なコマンドでないか、指定された入力パラメーターが受け入れられないか、コマンドが指定されたソケットの種類に適用できません。 |
| WSAEINPROGRESS | コールバックの実行中にこの関数が呼び出されました。 |
| WSAENETDOWN | ネットワークサブシステムで障害が発生しました。 |
| WSAENOTSOCK | 記述子 s がソケットではありません。 |
| WSAEOPNOTSUPP | 指定された IOCTL コマンドを実現できません。たとえば、SIO_SET_QOS で指定されたフロー仕様を満たせません。 |
| WSAEWOULDBLOCK | ソケットが非ブロッキングに設定されており、要求された操作はブロックされます。 |
解説(Remarks)
このルーチンは、ソケット、トランスポートプロトコル、または通信サブシステムに関連付けられた動作パラメーターを設定または取得するために使用します。lpOverlapped と lpCompletionRoutine の両方が NULL の場合、この関数ではソケットはオーバーラップしないソケットとして扱われます。
オーバーラップしないソケットでは、lpOverlapped と lpCompletionRoutine パラメーターは無視され、ソケット s がブロッキングモードの場合、この関数はブロックすることがあります。ソケット s が非ブロッキングモードの場合、指定された操作をただちに完了できないときは、この関数が WSAEWOULDBLOCK を返すことがあります。この場合、Windows Sockets SPI クライアントは、ソケットをブロッキングモードに変更して要求を再発行するか、対応するネットワークイベント (SIO_ROUTING_INTERFACE_CHANGE や SIO_ADDRESS_LIST_CHANGE の場合は FD_ROUTING_INTERFACE_CHANGE や FD_ADDRESS_LIST_CHANGE など) を、Windows メッセージ (LPWSPAsyncSelect を使用) またはイベント (LPWSPEventSelect を使用) に基づく通知メカニズムで待つことができます。
オーバーラップソケットでは、ただちに完了できない操作は開始され、完了は後で通知されます。返される lpcbBytesReturned パラメーターが指す DWORD 値は無視してかまいません。最終的な完了状態と転送バイト数は、操作の完了時に適切な完了方法がシグナル状態になったときに取得できます。
サービスプロバイダーの実装によっては、どの IOCTL も無期限にブロックする可能性があります。Windows Sockets SPI クライアントが LPWSPIoctl 呼び出しでのブロックを許容できない場合は、次のようなブロックする可能性が高い IOCTL にはオーバーラップ I/O の使用を推奨します。
- SIO_ADDRESS_LIST_CHANGE
- SIO_FINDROUTE
- SIO_FLUSH
- SIO_GET_QOS
- SIO_GET_GROUP_QOS
- SIO_ROUTING_INTERFACE_CHANGE
- SIO_SET_QOS
- SIO_SET_GROUP_QOS
プロトコル固有の一部の IOCTL も、特にブロックしやすい場合があります。利用可能な情報については、該当するプロトコル固有の付属文書を確認してください。
lpCompletionRoutine パラメーターが指す完了ルーチンのプロトタイプは次のとおりです。
void CALLBACK
CompletionRoutine(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
CompletionRoutine は、アプリケーション定義の関数名のプレースホルダーです。dwError パラメーターは、lpOverlapped パラメーターで示されるオーバーラップ操作の完了状態を示します。cbTransferred パラメーターは、受信したバイト数を示します。dwFlags パラメーターは、この IOCTL では使用されません。この完了ルーチンは値を返しません。
dwIoControlCode パラメーターは 32 ビットの値であるため、オペコード識別子の空間を分割するのに便利なエンコード方式を採用できます。dwIoControlCode パラメーターは、Windows Sockets 1.1 および UNIX の制御コードとの下位互換性を保ちながら、新しい制御コードを追加する際にプロトコルやベンダーに依存しないように構成されています。dwIoControlCode パラメーターの形式は次のとおりです。
| ビット 31 | ビット 30 | ビット 29 | ビット 28 と 27 | ビット 26 ~ 16 | ビット 15 ~ 0 |
|---|---|---|---|---|---|
| I | O | V | T | ベンダー/アドレスファミリ | コード |
I は、IOC_IN と同様に、そのコードで入力バッファーが有効な場合に設定されます。
O は、IOC_OUT と同様に、そのコードで出力バッファーが有効な場合に設定されます。入力と出力の両方のパラメーターを持つコードでは、I と O の両方が設定されます。
V は、IOC_VOID と同様に、そのコードにパラメーターがない場合に設定されます。
T は、IOCTL の種類を定義する 2 ビットの値です。次の値が定義されています。
- 0 は、IOCTL が FIONREAD や FIONBIO などの標準的な UNIX の IOCTL コードであることを示します。
- 1 は、IOCTL が汎用の Windows Sockets 2 IOCTL コードであることを示します。Windows Sockets 2 用に定義される新しい IOCTL コードは T == 1 になります。
- 2 は、IOCTL が特定のアドレスファミリにのみ適用されることを示します。
- 3 IOCTL が特定のベンダーのプロバイダーにのみ適用されます。この種類では、ベンダー/アドレスファミリ メンバーに現れるベンダー番号が企業に割り当てられます。これにより、ベンダーは IOCTL を登録機関に登録することなく、そのベンダー固有の新しい IOCTL を定義でき、ベンダーにとっての柔軟性と機密性が確保されます。
ベンダー/アドレスファミリ は 11 ビットの値で、コードを所有するベンダー (T == 3 の場合)、またはコードが適用されるアドレスファミリ (T == 2 の場合) を表します。UNIX の IOCTL コード (T == 0) の場合、このメンバーは UNIX 上のコードと同じ値になります。汎用の Windows Sockets 2 IOCTL (T == 1) の場合、このメンバーはコードメンバーの拡張として、追加のコード値を提供するために使用できます。
コード は、その操作に固有の IOCTL コードです。
次の UNIX コマンドがサポートされています。
-
FIONBIO
-
ソケット s の非ブロッキングモードを有効または無効にします。lpvInBuffer パラメーターは unsigned long を指し、非ブロッキングモードを有効にする場合は 0 以外、無効にする場合は 0 を指定します。ソケットは作成時にはブロッキングモードで動作します (つまり非ブロッキングモードは無効です)。これは Berkeley Software Distribution (BSD) ソケットと同じ動作です。
LPWSPAsyncSelect または LPWSPEventSelect ルーチンは、ソケットを自動的に非ブロッキングモードに設定します。 ソケットに対して LPWSPAsyncSelect または LPWSPEventSelect が発行されている場合、LPWSPIoctl を使用してソケットをブロッキングモードに戻そうとすると、WSAEINVAL で失敗します。ソケットをブロッキングモードに戻すには、Windows Sockets SPI クライアントはまず、lEvent パラメーターに 0 を指定して LPWSPAsyncSelect を呼び出して LPWSPAsyncSelect を無効にするか、lNetworkEvents パラメーターに 0 を指定して LPWSPEventSelect を呼び出して LPWSPEventSelect を無効にする必要があります。
-
FIONREAD
-
ソケット s からアトミックに読み取れるデータ量を調べます。lpvOutBuffer パラメーターは、WSAIoctl が結果を格納する unsigned long を指します。
s パラメーターに渡されたソケットがストリーム指向 (たとえば SOCK_STREAM 型) の場合、FIONREAD は 1 回の受信操作で読み取れるデータの総量を返します。これは通常、ソケットにキューイングされているデータの総量と同じですが、データストリームはバイト指向であるため保証はされません。
s パラメーターに渡されたソケットがメッセージ指向 (たとえば SOCK_DGRAM 型) の場合、FIONREAD は、ソケットにキューイングされている最初のデータグラム (メッセージ) のサイズではなく、読み取り可能な総バイト数を返します。
-
SIOCATMARK
-
すべての OOB データが読み取られたかどうかを判断します。これは、OOB データのインライン受信 (SO_OOBINLINE) が構成されたストリーム型のソケット (たとえば SOCK_STREAM 型) にのみ適用されます。読み取り待ちの OOB データがない場合、この操作は TRUE を返します。それ以外の場合は FALSE を返し、そのソケットで次に実行する受信操作で、マークより前のデータの一部またはすべてが取得されます。Windows Sockets SPI クライアントは、残りがあるかどうかを判断するために SIOCATMARK 操作を使用してください。緊急 (OOB) データより前に通常のデータがある場合、それらは順番に受信されます (受信操作で OOB データと通常のデータが同じ呼び出しに混在することはありません)。lpvOutBuffer は、LPWSPIoctl が結果を格納する BOOL を指します。
次の Windows Sockets 2 コマンドがサポートされています。
-
SIO_ACQUIRE_PORT_RESERVATION (オペコード設定: I, T==3)
-
TCP または UDP ポートのブロックに対するランタイム予約を要求します。ランタイムポート予約では、ポートプールは、予約が許可されたソケットを持つプロセスから予約が消費されることを要求します。ランタイムポート予約は、SIO_ACQUIRE_PORT_RESERVATION IOCTL を呼び出したソケットの有効期間中のみ持続します。これに対し、CreatePersistentTcpPortReservation 関数または CreatePersistentUdpPortReservation 関数で作成した永続的なポート予約は、永続予約を取得できる任意のプロセスから消費できます。
詳細については、SIO_ACQUIRE_PORT_RESERVATION のリファレンスを参照してください。
SIO_ACQUIRE_PORT_RESERVATION は、Windows Vista 以降のバージョンのオペレーティングシステムでサポートされています。
-
SIO_ADDRESS_LIST_CHANGE (オペコード設定: T==1)
-
Windows Sockets SPI クライアントがバインドできる、ソケットのプロトコルファミリのローカルトランスポートアドレス一覧の変更を通知します。この IOCTL の完了時に出力情報は提供されません。完了は、利用可能なローカルアドレスの一覧が変更されたことを示すだけであり、SIO_ADDRESS_LIST_QUERY で再度照会する必要があります。
Windows Sockets SPI クライアントは、SIO_ADDRESS_LIST_CHANGE 要求の完了によって変更を通知されるために、オーバーラップ I/O を使用することが想定されています (必須ではありません)。あるいは、SIO_ADDRESS_LIST_CHANGE IOCTL を非ブロッキングソケットに対してオーバーラップパラメーターなしで (lpOverlapped と lpCompletionRoutine を NULL に設定して) 発行した場合、エラー WSAEWOULDBLOCK でただちに完了します。その場合、Windows Sockets SPI クライアントは、ネットワークイベントビットマスクに FD_ADDRESS_LIST_CHANGE ビットを設定して LPWSPEventSelect または LPWSPAsyncSelect を呼び出し、アドレス一覧の変更イベントを待つことができます。
-
SIO_ADDRESS_LIST_QUERY (オペコード設定: O, T==1)
-
アプリケーションがバインドできる、ソケットのプロトコルファミリのローカルトランスポートアドレスの一覧を取得します。アドレスの一覧はアドレスファミリによって異なり、一部のアドレスは一覧から除外されます。
メモWindows のプラグアンドプレイ環境では、アドレスは動的に追加および削除されます。そのため、アプリケーションは SIO_ADDRESS_LIST_QUERY が返す情報が永続的であることを前提にはできません。アプリケーションは、オーバーラップ I/O または FD_ADDRESS_LIST_CHANGE イベントによる通知を提供する SIO_ADDRESS_LIST_CHANGE IOCTL によって、アドレス変更通知を登録できます。アプリケーションが常に最新のアドレス一覧情報を保持するには、次の一連の操作を使用します。
- SIO_ADDRESS_LIST_CHANGE IOCTL を発行する
- SIO_ADDRESS_LIST_QUERY IOCTL を発行する
- SIO_ADDRESS_LIST_CHANGE IOCTL が (オーバーラップ I/O または FD_ADDRESS_LIST_CHANGE イベントのシグナルによって) アドレス一覧の変更をアプリケーションに通知したときは、この一連の操作全体を繰り返します。
詳細については、SIO_ADDRESS_LIST_QUERY のリファレンスを参照してください。 SIO_ADDRESS_LIST_QUERY は、Windows 2000 以降でサポートされています。
-
SIO_ASSOCIATE_HANDLE (オペコード設定: I, T==1)
-
このソケットを、指定されたコンパニオンインターフェイスのハンドルに関連付けます。入力バッファーには、コンパニオンインターフェイスのマニフェスト定数に対応する整数値 (たとえば TH_NETDEV や TH_TAPI) と、それに続く指定されたコンパニオンインターフェイスのハンドルの値、およびその他の必要な情報が含まれます。詳細については、Windows Sockets 2 Protocol-Specific Annex の該当セクションや、対象のコンパニオンインターフェイスのドキュメントを参照してください (これらの資料は英語のみの場合があります)。合計サイズは入力バッファー長に反映されます。出力バッファーは不要です。 この IOCTL をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。 この IOCTL で関連付けられたハンドルは、SIO_TRANSLATE_HANDLE を使用して取得できます。
コンパニオンインターフェイスは、たとえば特定のプロバイダーが次のようなものを提供する場合に使用します。
- ソケットの動作に対する多数の追加制御。
- 既存の (または将来想定される) Windows ソケット関数に対応しない、プロバイダー固有の制御。
ソケットがサポートする可能性のある他のインターフェイスを検出および追跡するには、この IOCTL ではなくコンポーネントオブジェクトモデル (COM) を使用することが推奨されます。 この IOCTL は、COM が利用できない、または何らかの理由で使用できないシステムとの下位互換性のために用意されています。
-
SIO_ASSOCIATE_PORT_RESERVATION (オペコード設定: I, T==3)
-
ポート予約トークンで識別される、TCP または UDP ポートのブロックに対する永続予約またはランタイム予約に、ソケットを関連付けます。SIO_ASSOCIATE_PORT_RESERVATION IOCTL は、ソケットをバインドする前に発行する必要があります。ソケットがバインドされると、割り当てられるポートは、指定されたトークンで識別されるポート予約から選択されます。指定された予約に利用可能なポートがない場合、Bind 関数の呼び出しは失敗します。
詳細については、SIO_ASSOCIATE_PORT_RESERVATION のリファレンスを参照してください。
SIO_ASSOCIATE_PORT_RESERVATION は、Windows Vista 以降のバージョンのオペレーティングシステムでサポートされています。
-
SIO_BASE_HANDLE (オペコード設定: O, T==1)
-
指定されたソケットの基底サービスプロバイダーハンドルを取得します。返される値は SOCKET です。
戻り値は基底サービスプロバイダーのソケットハンドルでなければならないため、階層化サービスプロバイダーはこの IOCTL を決してインターセプトしないでください。
出力バッファーがソケットハンドルに対して十分な大きさでない場合 (cbOutBuffer が SOCKET のサイズより小さい場合)、または lpvOutBuffer パラメーターが NULL ポインターの場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEFAULT を返します。
SIO_BASE_HANDLE は Mswsock.h ヘッダーファイルで定義されており、Windows Vista 以降でサポートされています。
-
SIO_BSP_HANDLE (オペコード設定: O, T==1)
-
WSASendMsg 関数が使用するソケットの基底サービスプロバイダーハンドルを取得します。返される値は SOCKET です。
この Ioctl は、階層化サービスプロバイダーが WSASendMsg 関数を確実にインターセプトするために使用します。
出力バッファーがソケットハンドルに対して十分な大きさでない場合 (cbOutBuffer が SOCKET のサイズより小さい場合)、または lpvOutBuffer パラメーターが NULL ポインターの場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEFAULT を返します。
SIO_BSP_HANDLE は Mswsock.h ヘッダーファイルで定義されており、Windows Vista 以降でサポートされています。
-
SIO_BSP_HANDLE_SELECT (オペコード設定: O, T==1)
-
select 関数が使用するソケットの基底サービスプロバイダーハンドルを取得します。返される値は SOCKET です。
この Ioctl は、階層化サービスプロバイダーが select 関数を確実にインターセプトするために使用します。
出力バッファーがソケットハンドルに対して十分な大きさでない場合 (cbOutBuffer が SOCKET のサイズより小さい場合)、または lpvOutBuffer パラメーターが NULL ポインターの場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEFAULT を返します。
SIO_BSP_HANDLE_SELECT は Mswsock.h ヘッダーファイルで定義されており、Windows Vista 以降でサポートされています。
-
SIO_BSP_HANDLE_POLL (オペコード設定: O, T==1)
-
WSAPoll 関数が使用するソケットの基底サービスプロバイダーハンドルを取得します。lpOverlapped パラメーターは NULL ポインターでなければなりません。返される値は SOCKET です。
この Ioctl は、階層化サービスプロバイダーが WSAPoll 関数を確実にインターセプトするために使用します。
出力バッファーがソケットハンドルに対して十分な大きさでない場合 (cbOutBuffer が SOCKET のサイズより小さい場合)、lpvOutBuffer パラメーターが NULL ポインターの場合、または lpOverlapped パラメーターが NULL ポインターでない場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEFAULT を返します。
SIO_BSP_HANDLE_POLL は Mswsock.h ヘッダーファイルで定義されており、Windows Vista 以降でサポートされています。
-
SIO_CHK_QOS (オペコード設定: I, O, T==3)
-
QoS のトラフィック特性に関する情報を取得します。送信側システムで、フローのセットアップから RESV メッセージの受信までの移行フェーズ (移行フェーズの詳細については「How the RSVP Service Invokes TC」を参照) では、RSVP フローに関連付けられたトラフィックは、サービスの種類 (BEST EFFORT、CONTROLLED LOAD、または GUARANTEED) に基づいてシェーピングされます。詳細については、Platform Software Development Kit (SDK) の Quality of Service セクションにある「Using SIO_CHK_QOS」を参照してください。
-
SIO_ENABLE_CIRCULAR_QUEUEING (オペコード設定: V, T==1)
-
バッファーキューのオーバーフローによって新しく到着したメッセージが破棄されないことを、メッセージ指向のサービスプロバイダーに指示します。代わりに、新しく到着したメッセージを格納するために、キュー内で最も古いメッセージが破棄されます。入力バッファーと出力バッファーは不要です。この IOCTL は、信頼性のないメッセージ指向のプロトコルに関連付けられたソケットでのみ有効です。この IOCTL をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。
-
SIO_FIND_ROUTE (オペコード設定: O, T==1)
-
この IOCTL を発行すると、入力バッファーに sockaddr として指定されたリモートアドレスへの経路を探索するよう要求します。そのアドレスがローカルキャッシュに既に存在する場合、そのエントリは無効化されます。Novell の IPX の場合、この呼び出しは、指定されたリモートアドレスについてネットワークに問い合わせる IPX GetLocalTarget (GLT) を開始します。
-
SIO_FLUSH (オペコード設定: V, T==1)
-
このソケットに関連付けられた送信キューの現在の内容を破棄します。入力バッファーと出力バッファーは不要です。 この IOCTL をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。
-
SIO_GET_BROADCAST_ADDRESS (オペコード設定: O, T==1)
-
この IOCTL は、LPWSPSendTo で使用するのに適したブロードキャストアドレスを含む sockaddr 構造体を、出力バッファーに格納します。
-
SIO_GET_EXTENSION_FUNCTION_POINTER (オペコード設定: O, I, T==1)
-
関連付けられたサービスプロバイダーがサポートする、指定された拡張関数へのポインターを取得します。入力バッファーには、対象の拡張関数を識別するグローバル一意識別子 (GUID) が含まれます。目的の関数へのポインターは出力バッファーに返されます。拡張関数の識別子はサービスプロバイダーのベンダーが定めるもので、拡張関数の機能と動作を説明するベンダーのドキュメントに記載されます。
Windows の TCP/IP サービスプロバイダーがサポートする拡張関数の GUID 値は、Mswsock.h ヘッダーファイルで定義されています。これらの GUID に指定できる値は次のとおりです。
用語 説明 WSAID_ACCEPTEX AcceptEx 拡張関数です。 WSAID_CONNECTEX ConnectEx 拡張関数です。 WSAID_DISCONNECTEX DisconnectEx 拡張関数です。 WSAID_GETACCEPTEXSOCKADDRS GetAcceptExSockaddrs 拡張関数です。 WSAID_TRANSMITFILE TransmitFile 拡張関数です。 WSAID_TRANSMITPACKETS TransmitPackets 拡張関数です。 WSAID_WSARECVMSG LPFN_WSARECVMSG (WSARecvMsg) 拡張関数です。 WSAID_WSASENDMSG WSASendMsg 拡張関数です。 -
SIO_GET_GROUP_QOS (オペコード設定: O, T==1)
-
予約済みです。
-
SIO_GET_INTERFACE_LIST (オペコード設定: O, T==0)
-
構成済みの IP インターフェイスとそのパラメーターの一覧を、INTERFACE_INFO 構造体の配列として返します。
メモこのコマンドのサポートは、Windows Sockets 2 準拠の TCP/IP サービスプロバイダーでは必須です。
lpvOutBuffer パラメーターは、インターフェイス上のユニキャスト IP アドレスに関するインターフェイス情報を INTERFACE_INFO 構造体の配列として格納するバッファーを指します。cbOutBuffer パラメーターは、出力バッファーの長さを指定します。返されるインターフェイスの数 (lpvOutBuffer パラメーターが指すバッファーに返される構造体の数) は、lpcbBytesReturned パラメーターに返される出力バッファーの実際の長さから判断できます。
WSAIoctl 関数を SIO_GET_INTERFACE_LIST で呼び出したときに、ソケット s パラメーターの level メンバーが IPPROTO_IP として定義されていない場合、WSAEINVAL が返されます。出力バッファーの長さを指定する cbOutBuffer パラメーターが、構成済みインターフェイスの一覧を受け取るには小さすぎる場合、SIO_GET_INTERFACE_LIST を指定した WSAIoctl 関数の呼び出しは WSAEFAULT を返します。
-
SIO_GET_INTERFACE_LIST_EX (オペコード設定: O, T==0)
-
ソケットでの将来の使用のために予約されています。
構成済みの IP インターフェイスとそのパラメーターの一覧を、INTERFACE_INFO_EX 構造体の配列として返します。
lpvOutBuffer パラメーターは、インターフェイス上のユニキャスト IP アドレスに関するインターフェイス情報を INTERFACE_INFO_EX 構造体の配列として格納するバッファーを指します。cbOutBuffer パラメーターは、出力バッファーの長さを指定します。返されるインターフェイスの数 (lpvOutBuffer に返される構造体の数) は、lpcbBytesReturned パラメーターに返される出力バッファーの実際の長さから判断できます。
SIO_GET_INTERFACE_LIST_EX は、現在 Windows ではサポートされていません。
-
SIO_GET_QOS (オペコード設定: O, T==1)
-
ソケットに関連付けられた QOS 構造体を取得します。入力バッファーは省略可能です。一部のプロトコル (RSVP など) では、入力バッファーを使用して QOS 要求を限定できます。QOS 構造体は出力バッファーにコピーされます。出力バッファーは、QOS 構造体全体を格納できる十分な大きさが必要です。 QoS をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。
-
SIO_IDEAL_SEND_BACKLOG_CHANGE (オペコード設定: V, T==0)
-
基盤となる接続の理想送信バックログ (ISB) 値が変化したときに、アプリケーションに通知します。
Windows ソケットで TCP 接続を介してデータを送信する場合、最大のスループットを得るには、TCP 上に十分な量の未処理データ (送信済みだが未確認応答のデータ) を保つことが重要です。TCP 接続で最良のスループットを得るための未処理データ量の理想値を、理想送信バックログ (ISB) サイズと呼びます。ISB 値は、TCP 接続の帯域幅遅延積と受信側が通知する受信ウィンドウ (および一部はネットワークの輻輳の程度) によって決まります。
接続ごとの ISB 値は、Windows Server 2008、Windows Vista with Service Pack 1 (SP1)、およびそれ以降のバージョンのオペレーティングシステムの TCP プロトコル実装から取得できます。アプリケーションは、SIO_IDEAL_SEND_BACKLOG_CHANGE IOCTL を使用して、接続の ISB 値が動的に変化したときに通知を受け取ることができます。
詳細については、SIO_IDEAL_SEND_BACKLOG_CHANGE のリファレンスを参照してください。
SIO_IDEAL_SEND_BACKLOG_CHANGE は、Windows Server 2008、Windows Vista with SP1、およびそれ以降のバージョンのオペレーティングシステムでサポートされています。
-
SIO_IDEAL_SEND_BACKLOG_QUERY (オペコード設定: O, T==0)
-
基盤となる接続の理想送信バックログ (ISB) 値を取得します。
Windows ソケットで TCP 接続を介してデータを送信する場合、最大のスループットを得るには、TCP 上に十分な量の未処理データ (送信済みだが未確認応答のデータ) を保つことが重要です。TCP 接続で最良のスループットを得るための未処理データ量の理想値を、理想送信バックログ (ISB) サイズと呼びます。ISB 値は、TCP 接続の帯域幅遅延積と受信側が通知する受信ウィンドウ (および一部はネットワークの輻輳の程度) によって決まります。
接続ごとの ISB 値は、Windows Server 2008 以降の TCP プロトコル実装から取得できます。アプリケーションは、SIO_IDEAL_SEND_BACKLOG_QUERY IOCTL を使用して、接続の ISB 値を照会できます。
詳細については、SIO_IDEAL_SEND_BACKLOG_QUERY のリファレンスを参照してください。
SIO_IDEAL_SEND_BACKLOG_QUERY は、Windows Server 2008、Windows Vista with SP1、およびそれ以降のバージョンのオペレーティングシステムでサポートされています。
-
SIO_KEEPALIVE_VALS (オペコード設定: I, T==3)
-
TCP の keep-alive タイムアウトと間隔を指定する TCP keep-alive オプションの、接続ごとの設定を有効または無効にします。keep-alive オプションの詳細については、IETF の Web サイト で公開されている RFC 1122 の Requirements for Internet Hosts—Communication Layers のセクション 4.2.3.6 を参照してください。
SIO_KEEPALIVE_VALS を使用すると、keep-alive プローブを有効または無効にし、keep-alive のタイムアウトと間隔を設定できます。keep-alive タイムアウトは、最初の keep-alive パケットが送信されるまでの無活動時間をミリ秒単位で指定します。keep-alive 間隔は、確認応答が受信されない場合に、後続の keep-alive パケットが送信される間隔をミリ秒単位で指定します。
SOL_SOCKET ソケットオプションの 1 つである SO_KEEPALIVE オプションでも、接続での TCP keep-alive の有効・無効の切り替えや、このオプションの現在の状態の照会ができます。ソケットで TCP keep-alive が有効かどうかを照会するには、SO_KEEPALIVE オプションを指定して getsockopt 関数を呼び出します。TCP keep-alive を有効または無効にするには、SO_KEEPALIVE オプションを指定して setsockopt 関数を呼び出します。SO_KEEPALIVE で TCP keep-alive を有効にした場合、SIO_KEEPALIVE_VALS でこれらの値を変更していない限り、keep-alive のタイムアウトと間隔には TCP の既定の設定が使用されます。
詳細については、SIO_KEEPALIVE_VALS のリファレンスを参照してください。 SIO_KEEPALIVE_VALS は、Windows 2000 以降でサポートされています。
-
SIO_MULTIPOINT_LOOPBACK (オペコード設定: I, T==1)
-
マルチキャストセッションでローカルコンピューター上のアプリケーション (同じソケットとは限りません) が送信したデータを、ループバックインターフェイス上でマルチキャスト宛先グループに参加しているソケットが受信するかどうかを制御します。値が TRUE の場合、ローカルコンピューター上のアプリケーションが送信したマルチキャストデータは、ループバックインターフェイス上でリッスンしているソケットに配信されます。値が FALSE の場合、ローカルコンピューター上のアプリケーションが送信したマルチキャストデータは、ループバックインターフェイス上でリッスンしているソケットには配信されません。既定では、SIO_MULTIPOINT_LOOPBACK は有効です。
-
SIO_MULTICAST_SCOPE (オペコード設定: I, T==1)
-
マルチキャスト送信が及ぶスコープを指定します。スコープは、対象となるルーティングされたネットワークセグメントの数として定義されます。スコープが 0 の場合、マルチキャスト送信はネットワーク上に送出されず、ローカルホスト内のソケット間にのみ配信されます。スコープ値が 1 (既定値) の場合、送信はネットワーク上に送出されますが、ルーターを越えることはありません。スコープ値を大きくすると、越えられるルーターの数が決まります。これは IP マルチキャストの time-to-live (TTL) パラメーターに対応します。
-
SIO_QUERY_RSS_SCALABILITY_INFO (オペコード設定: O, T==3)
-
受信側スケーリング (RSS) 機能についてオフロードインターフェイスを照会します。SIO_QUERY_RSS_SCALABILITY_INFO で返される引数構造体は、Mstcpip.h ヘッダーファイルで定義されている RSS_SCALABILITY_INFO 構造体で指定されます。この構造体は次のように定義されています。
void CALLBACK CompletionRoutine( IN DWORD dwError, IN DWORD cbTransferred, IN LPWSAOVERLAPPED lpOverlapped, IN DWORD dwFlags );RssEnabled メンバーに返される値は、少なくとも 1 つのインターフェイスで RSS が有効かどうかを示します。
出力バッファーが RSS_SCALABILITY_INFO 構造体に対して十分な大きさでない場合 (cbOutBuffer が RSS_SCALABILITY_INFO のサイズより小さい場合)、または lpvOutBuffer パラメーターが NULL ポインターの場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEINVAL を返します。
1 つのシステムに複数の CPU が存在する高速ネットワークでは、NDIS 5.1 以前のアーキテクチャが受信プロトコル処理を単一の CPU に制限するため、ネットワークプロトコルスタックがマルチ CPU システムで十分にスケールできません。受信側スケーリング (RSS) は、ネットワークアダプターからのネットワーク負荷を複数の CPU に分散できるようにすることで、この問題を解決します。
SIO_QUERY_RSS_SCALABILITY_INFO は、Windows Vista 以降でサポートされています。
-
SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE (オペコード設定: O, T==3)
-
アプリケーション層施行 (ALE) のエンドポイントハンドルを照会します。
Windows フィルタリングプラットフォーム (WFP) は、ネットワークトラフィックの検査と変更をサポートします。Windows Vista では、WFP はホストマシンが通信エンドポイントとなるシナリオに重点を置いています。ただし Windows Server 2008 では、通過トラフィックの検査やプロキシ処理に WFP プラットフォームを活用したいエッジファイアウォールの実装があります。Internet Security and Acceleration (ISA) サーバーは、そのようなエッジデバイスの一例です。
ファイアウォールのシナリオによっては、受信パケットを既存のエンドポイントに関連付けられた送信パスに挿入する機能が必要になる場合があります。そのためには、宛先エンドポイントに関連付けられたトランスポート層エンドポイントハンドルを検出する仕組みが必要です。これらのトランスポート層エンドポイントは、エンドポイントを作成したアプリケーションが所有します。この IOCTL は、ソケットハンドルからトランスポート層エンドポイントハンドルへのマッピングを提供するために使用します。
出力バッファーがエンドポイントハンドルに対して十分な大きさでない場合 (cbOutBuffer が UINT64 のサイズより小さい場合)、または lpvOutBuffer パラメーターが NULL ポインターの場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEINVAL を返します。
SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE は、Windows Vista 以降でサポートされています。
-
SIO_QUERY_PNP_TARGET_HANDLE (オペコード設定: O, T==1)
-
現在のソケットが PnP の意味で依存する、チェーン内の次のプロバイダーのソケット記述子を取得します。この IOCTL は、WPUCreateSocketHandle 呼び出しで作成された非 IFS サービスプロバイダーのソケットに対してのみ、Windows Sockets 2 DLL から呼び出されます。プロバイダーは、指定されたソケットハンドルが PnP の意味で依存する、チェーン内の次のプロバイダーのソケットハンドルを出力バッファーに返す必要があります (たとえば、基盤となるハンドルをサポートするデバイスが削除されると、チェーン内でその上位にあるハンドルは無効になります)。
オーバーラップ操作がただちに完了した場合、この関数はゼロを返し、lpcbBytesReturned パラメーターには出力バッファー内のバイト数が設定されます。オーバーラップ操作が正常に開始され、後で完了する場合、この関数は SOCKET_ERROR を返し、エラーコード WSA_IO_PENDING を示します。この場合、lpcbBytesReturned は更新されません。オーバーラップ操作が完了すると、出力バッファー内のデータ量は、完了ルーチンの cbTransferred パラメーター (指定されている場合)、または LPWSPGetOverlappedResult の lpcbTransfer パラメーターで示されます。
-
SIO_RCVALL (オペコード設定: I, T==3)
-
ネットワークインターフェイスを通過するすべての IPv4 または IPv6 パケットをソケットが受信できるようにします。WSAIoctl 関数に渡すソケットハンドルは、次のいずれかである必要があります。
- アドレスファミリに AF_INET、ソケット型に SOCK_RAW、プロトコルに IPPROTO_IP を指定して作成された IPv4 ソケット。
- アドレスファミリに AF_INET6、ソケット型に SOCK_RAW、プロトコルに IPPROTO_IPV6 を指定して作成された IPv6 ソケット。
また、ソケットは明示的なローカルの IPv4 または IPv6 インターフェイスにバインドする必要があります。つまり、INADDR_ANY や in6addr_any にバインドすることはできません。
Windows Server 2008 以前では、SIO_RCVALL IOCTL の設定では、ネットワークインターフェイスから送出されるローカルパケットはキャプチャされませんでした。これには、別のインターフェイスで受信され、SIO_RCVALL IOCTL に指定されたネットワークインターフェイスから転送されたパケットも含まれます。
Windows 7 および Windows Server 2008 R2 では、ネットワークインターフェイスから送出されるローカルパケットもキャプチャされるように変更されました。これには、別のインターフェイスで受信され、SIO_RCVALL IOCTL でソケットにバインドされたネットワークインターフェイスから転送されたパケットも含まれます。
この IOCTL を設定するには、ローカルコンピューターの管理者特権が必要です。
この機能は、プロミスキャスモードと呼ばれることがあります。
SIO_RCVALL IOCTL オプションに指定できる値は、Mstcpip.h ヘッダーファイルで定義されている RCVALL_VALUE 列挙体で規定されています。SIO_RCVALL に指定できる値は次のとおりです。
用語 説明 RCVALL_OFF このオプションを無効にして、ソケットがネットワーク上のすべての IPv4 または IPv6 パケットを受信しないようにします。 RCVALL_ON このオプションを有効にして、ソケットがネットワーク上のすべての IPv4 または IPv6 パケットを受信するようにします。NIC がプロミスキャスモードをサポートしている場合、このオプションはネットワークインターフェイスカード (NIC) のプロミスキャスモードを有効にします。ネットワークハブを備えた LAN セグメントでは、プロミスキャスモードをサポートする NIC は、同じ LAN セグメント上の他のコンピューター間のトラフィックを含め、LAN 上のすべての IPv4 または IPv6 トラフィックをキャプチャします。キャプチャされたすべてのパケット (ソケットに応じて IPv4 または IPv6) は raw ソケットに配信されます。
このオプションでは、インターフェイス上の他のパケット (ARP、IPX、NetBEUI パケットなど) はキャプチャされません。
Netmon はネットワークインターフェイスに対して同じモードを使用しますが、トラフィックのキャプチャにこのオプションは使用しません。RCVALL_SOCKETLEVELONLY この機能は現在実装されていないため、このオプションを設定しても効果はありません。 RCVALL_IPLEVEL このオプションを有効にして、IPv4 または IPv6 ソケットがネットワーク上の IP レベルのすべてのパケットを受信するようにします。このオプションは、ネットワークインターフェイスカードのプロミスキャスモードを有効にしません。このオプションは IP レベルのパケット処理にのみ影響します。NIC は引き続き、構成されたユニキャストアドレスおよびマルチキャストアドレス宛てのパケットのみを受信します。ただし、このオプションを有効にしたソケットは、特定の IP アドレス宛てのパケットだけでなく、NIC が受信するすべての IPv4 または IPv6 パケットを受信します。
このオプションでは、インターフェイスで受信した他のパケット (ARP、IPX、NetBEUI パケットなど) はキャプチャされません。詳細については、SIO_RCVALL のリファレンスを参照してください。
SIO_RCVALL は、Windows 2000 以降でサポートされています。
-
SIO_RELEASE_PORT_RESERVATION (オペコード設定: I, T==3)
-
TCP または UDP ポートのブロックに対するランタイム予約を解放します。解放するランタイム予約は、発行元プロセスが SIO_ACQUIRE_PORT_RESERVATION IOCTL を使用して取得したものである必要があります。
詳細については、SIO_RELEASE_PORT_RESERVATION のリファレンスを参照してください。
SIO_RELEASE_PORT_RESERVATION は、Windows Vista 以降のバージョンのオペレーティングシステムでサポートされています。
-
SIO_ROUTING_INTERFACE_CHANGE (オペコード設定: I, T==1)
-
入力バッファー内のリモートアドレス (sockaddr 構造体として指定) に到達するために使用すべきルーティングインターフェイスの変更を通知します。この IOCTL の完了時に、新しいルーティングインターフェイスに関する出力情報は提供されません。完了は、指定された宛先のルーティングインターフェイスが変更されたことを示すだけであり、SIO_ROUTING_INTERFACE_QUERY IOCTL で照会する必要があります。
アプリケーションは、SIO_ROUTING_INTERFACE_CHANGE 要求の完了によってルーティングインターフェイスの変更を通知されるために、オーバーラップ I/O を使用することが想定されています (必須ではありません)。あるいは、SIO_ROUTING_INTERFACE_CHANGE IOCTL を非ブロッキングソケットに対して lpOverlapped と lpCompletionRoutine パラメーターを NULL に設定して発行した場合、エラー WSAEWOULDBLOCK でただちに完了します。その場合、Windows Socket SPI クライアントは、ネットワークイベントビットマスクに FD_ROUTING_INTERFACE_CHANGE ビットを設定して LPWSPEventSelect または LPWSPAsyncSelect を呼び出し、ルーティング変更イベントを待つことができます。
ルーティング情報はほとんどの場合安定しているため、アプリケーションが関心のあるすべての宛先について通知を受け取るために複数の IOCTL を未処理のまま保持し、さらにサービスプロバイダーがそれらの通知要求を追跡することは、システムリソースを大量に消費します。この状況は、入力パラメーターの意味を拡張し、サービスプロバイダーの要件を次のように緩和することで回避できます。
Windows Sockets SPI クライアントは、プロトコルファミリ固有のワイルドカードアドレス (利用可能な任意のアドレスへのバインドを要求するときに Bind 呼び出しで使用するものと同じ) を指定して、任意のルーティング変更の通知を要求できます。これにより、Windows Sockets SPI クライアントは、保持しているすべてのソケットと宛先に対して未処理の SIO_ROUTING_INTERFACE_CHANGE を 1 つだけ保持し、SIO_ROUTING_INTERFACE_QUERY を使用して実際のルーティング情報を取得できます。
サービスプロバイダーは、SIO_ROUTING_INTERFACE_CHANGE の入力バッファーで Windows Sockets SPI クライアントが指定した情報を (ワイルドカードアドレスが指定されたものとみなして) 無視し、任意のルーティング情報の変更 (入力バッファーで指定された宛先への経路に限りません) が発生したときに SIO_ROUTING_INTERFACE_CHANGE IOCTL を完了するか、FD_ROUTING_INTERFACE_CHANGE イベントをシグナル状態にすることを選択できます。
-
SIO_ROUTING_INTERFACE_QUERY (オペコード設定: I, O, T==1)
-
入力バッファーで (sockaddr として) 指定されたリモートアドレスへの送信に使用すべきローカルインターフェイスのアドレス (sockaddr 構造体として表現) を取得します。入力バッファーにリモートのマルチキャストアドレスを指定すると、マルチキャスト送信に適したインターフェイスのアドレスを取得できます。いずれの場合も、返されたインターフェイスアドレスは、アプリケーションが後続の Bind 要求で使用できます。
経路は変更される可能性があります。そのため、Windows Socket SPI クライアントは SIO_ROUTING_INTERFACE_QUERY が返す情報が永続的であることを前提にはできません。SPI クライアントは、オーバーラップ I/O または FD_ROUTING_INTERFACE_CHANGE イベントによる通知を提供する SIO_ROUTING_INTERFACE_CHANGE IOCTL によって、ルーティング変更通知を登録できます。Windows Socket SPI クライアントが、指定された宛先について常に最新のルーティングインターフェイス情報を保持するには、次の一連の操作を使用します。
- SIO_ROUTING_INTERFACE_CHANGE IOCTL を発行します。
- SIO_ROUTING_INTERFACE_QUERY IOCTL を発行します。
- SIO_ROUTING_INTERFACE_CHANGE IOCTL が (オーバーラップ I/O または FD_ROUTING_INTERFACE_CHANGE イベントのシグナルによって) ルーティングの変更を WinSock SPI クライアントに通知したときは、この一連の操作全体を繰り返します。
出力バッファーがインターフェイスアドレスを格納するのに十分な大きさでない場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAEFAULT を返します。この場合、必要な出力バッファーのサイズが lpcbBytesReturned に返されます。なお、lpvInBuffer、lpvOutBuffer、lpcbBytesReturned のいずれかのパラメーターがユーザーアドレス空間の有効な範囲に完全には含まれていない場合にも、WSAEFAULT エラーコードが返されます。
入力バッファーで指定された宛先アドレスに、利用可能ないずれのインターフェイスからも到達できない場合、この IOCTL の結果として SOCKET_ERROR が返され、WSAGetLastError は WSAENETUNREACH を返します。ネットワーク接続がすべて失われている場合は、WSAENETDOWN が返されることもあります。
-
SIO_SET_COMPATIBILITY_MODE (オペコード設定: I, T==3)
-
既定の処理方法が Windows のバージョンによって異なる可能性がある特定の動作について、ネットワークスタックがどのように処理するかを要求します。SIO_SET_COMPATIBILITY_MODE の引数構造体は、Mswsockdef.h ヘッダーファイルで定義されている WSA_COMPATIBILITY_MODE 構造体で指定されます。この構造体は次のように定義されています。
} WSA_COMPATIBILITY_MODE, *PWSA_COMPATIBILITY_MODE;BehaviorId メンバーに指定する値は、要求する動作を示します。TargetOsVersion メンバーに指定する値は、その動作について要求する Windows のバージョンを示します。
BehaviorId メンバーには、Mswsockdef.h ヘッダーファイルで定義されている WSA_COMPATIBILITY_BEHAVIOR_ID 列挙型の値のいずれかを指定できます。BehaviorId メンバーに指定できる値は次のとおりです
用語 説明 WsaBehaviorAll WSA_COMPATIBILITY_BEHAVIOR_ID に定義されている、可能なすべての互換動作を要求するのと同じです。 WsaBehaviorReceiveBuffering TargetOsVersion メンバーに Windows Vista 以降の値を設定した場合、SO_RCVBUF ソケットオプションによるこのソケットの TCP 受信バッファーサイズの縮小は、TCP 接続の確立後でも許可されます。
TargetOsVersion メンバーに Windows Vista より前の値を設定した場合、SO_RCVBUF ソケットオプションによるこのソケットの TCP 受信バッファーサイズの縮小は、接続の確立後は許可されません。WsaBehaviorAutoTuning TargetOsVersion メンバーに Windows Vista 以降の値を設定した場合、受信ウィンドウの自動チューニングが有効になり、TCP ウィンドウスケール係数は既定値の 8 から 2 に引き下げられます。
TargetOsVersion に Windows Vista より前の値を設定した場合、受信ウィンドウの自動チューニングは無効になります。TCP ウィンドウスケーリングオプションも無効になり、実際の受信ウィンドウの最大サイズは 65,535 バイトに制限されます。接続の確立前にこのソケットで SO_RCVBUF ソケットオプションを 65,535 バイトより大きい値で呼び出していても、その接続では TCP ウィンドウスケーリングオプションをネゴシエートできません。詳細については、SIO_SET_COMPATIBILITY_MODE のリファレンスを参照してください。
SIO_SET_COMPATIBILITY_MODE は、Windows Vista 以降でサポートされています。
-
SIO_SET_GROUP_QOS (オペコード設定: I, T==1)
-
予約済みです。
-
SIO_SET_QOS (オペコード設定: I, T==1)
-
指定された QOS 構造体をソケットに関連付けます。出力バッファーは不要で、QOS 構造体は入力バッファーから取得されます。 QoS をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。
-
SIO_TRANSLATE_HANDLE (オペコード設定: I, O, T==1)
-
コンパニオンインターフェイス (たとえば TH_NETDEV や TH_TAPI) のコンテキストで有効な、ソケット s に対応するハンドルを取得します。コンパニオンインターフェイスを識別するマニフェスト定数と、その他必要なパラメーターを入力バッファーで指定します。対応するハンドルは、この関数の完了時に出力バッファーで取得できます。詳細については、Windows Sockets 2 Protocol-Specific Annex の該当セクションや、対象のコンパニオンインターフェイスのドキュメントを参照してください。 指定されたコンパニオンインターフェイスについてこの IOCTL をサポートしないサービスプロバイダーでは、WSAENOPROTOOPT エラーコードが示されます。 この IOCTL は、SIO_TRANSLATE_HANDLE を使用して関連付けられたハンドルを取得します。
ソケットがサポートする可能性のある他のインターフェイスを検出および追跡するには、この IOCTL ではなく COM を使用することが推奨されます。 この IOCTL は、COM が利用できない、または何らかの理由で使用できないシステムとの下位互換性のために用意されています。
-
SIO_UDP_CONNRESET (オペコード設定: I, T==3)
-
Windows XP: UDP の PORT_UNREACHABLE メッセージを報告するかどうかを制御します。報告を有効にするには TRUE を設定します。報告を無効にするには FALSE を設定します。
オーバーラップソケットで呼び出す場合、lpOverlapped パラメーターはオーバーラップ操作の間、有効である必要があります。
lpCompletionRoutine パラメーターが NULL の場合、lpOverlapped の hEvent メンバーに有効なイベントオブジェクトハンドルが格納されていれば、サービスプロバイダーはオーバーラップ操作の完了時にそのメンバーをシグナル状態にします。Windows Sockets SPI クライアントは、LPWSPGetOverlappedResult を使用して、イベントオブジェクトをポーリングまたは待機できます。
lpCompletionRoutine が NULL でない場合、hEvent メンバーは無視され、Windows Sockets SPI クライアントが完了ルーチンにコンテキスト情報を渡すために使用できます。NULL 以外の lpCompletionRoutine を渡したクライアントが、同じオーバーラップ I/O 要求に対して後から WSAGetOverlappedResult を呼び出す場合、その WSAGetOverlappedResult の呼び出しで fWait パラメーターに TRUE を設定することはできません。この場合、hEvent メンバーの用途は未定義であり、hEvent メンバーを待機しようとすると予測できない結果になります。
オーバーラップ操作の完了時にクライアントが指定した完了ルーチンを呼び出す手配をするのは、サービスプロバイダーの責任です。完了ルーチンは、オーバーラップ操作を開始したのと同じスレッドのコンテキストで実行する必要があるため、サービスプロバイダーから直接呼び出すことはできません。WS2_32.DLL は、完了ルーチンの呼び出しを容易にする非同期プロシージャ呼び出し (APC) のメカニズムを提供します。
サービスプロバイダーは、WPUQueueApc を呼び出すことで、適切なスレッドおよびプロセスのコンテキストで関数が実行されるように手配します。この関数は、任意のプロセスおよびスレッドのコンテキストから呼び出せます。オーバーラップ操作の開始に使用したスレッドやプロセスとは異なるコンテキストからでもかまいません。
WPUQueueApc は、入力パラメーターとして、WSATHREADID 構造体へのポインター (lpThreadId 入力パラメーターでプロバイダーに渡されたもの)、呼び出す APC 関数へのポインター、および後で APC 関数に渡される 32 ビットのコンテキスト値を受け取ります。利用できるコンテキスト値は 32 ビットの 1 つだけであるため、APC 関数自体をクライアントが指定した完了ルーチンにすることはできません。代わりにサービスプロバイダーは、渡されたコンテキスト値を使用してオーバーラップ操作に必要な結果情報にアクセスし、クライアントが指定した完了ルーチンを呼び出す、自身の APC 関数へのポインターを指定する必要があります。
クライアントが指定する完了ルーチンのプロトタイプは次のとおりです。
);
CompletionRoutine は、クライアントが指定する関数のプレースホルダーです。dwError は、lpOverlapped で示されるオーバーラップ操作の完了状態を示します。cbTransferred は、返されたバイト数を示します。現在、フラグ値は定義されておらず、dwFlags はゼロになります。この関数は値を返しません。
この関数から戻ると、このソケットで保留中の別の完了ルーチンを呼び出せるようになります。完了ルーチンは任意の順序で呼び出される可能性があり、必ずしもオーバーラップ操作が完了した順序とは限りません。
互換性
T == 0 の IOCTL コードは、Berkeley ソケットで使用される IOCTL コードのサブセットです。特に、FIOASYNC に相当するコマンドはありません。
あるスレッドが開始したすべての I/O は、そのスレッドの終了時にキャンセルされます。オーバーラップソケットでは、操作が完了する前にスレッドが閉じられると、保留中の非同期操作が失敗することがあります。詳細については ExitThread を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)