LPWSPIOCTL コールバック関数 (ws2spi.h)

LPWSPIoctl 関数は、ソケットのモードを制御します。

構文

LPWSPIOCTL Lpwspioctl;

int Lpwspioctl(
  [in]  SOCKET s,
  [in]  DWORD dwIoControlCode,
  [in]  LPVOID lpvInBuffer,
  [in]  DWORD cbInBuffer,
  [out] LPVOID lpvOutBuffer,
  [in]  DWORD cbOutBuffer,
  [out] LPDWORD lpcbBytesReturned,
  [in]  LPWSAOVERLAPPED lpOverlapped,
  [in]  LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
  [in]  LPWSATHREADID lpThreadId,
  [in]  LPINT lpErrno
)
{...}

パラメーター

[in] s

ソケットを識別する記述子。

[in] dwIoControlCode

実行する操作の制御コード。

[in] lpvInBuffer

入力バッファーへのポインター。

[in] cbInBuffer

入力バッファーのサイズ (バイト単位)。

[out] lpvOutBuffer

出力バッファーへのポインター。

[in] cbOutBuffer

出力バッファーのサイズ (バイト単位)。

[out] lpcbBytesReturned

出力の実際のバイト数へのポインター。

[in] lpOverlapped

WSAOverlapped 構造体へのポインター (重複していないソケットの場合は無視されます)。

[in] lpCompletionRoutine

種類: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

操作が完了したときに呼び出される完了ルーチンへのポインター (重複していないソケットの場合は無視されます)。 「解説」を参照してください。

[in] lpThreadId

WPUQueueApc への後続の呼び出しでプロバイダーによって使用される WSATHREADID 構造体へのポインター。 プロバイダーは、WPUQueueApc 関数が戻るまで、参照先の WSATHREADID 構造体 (ポインターではなく) を格納する必要があります。

[in] lpErrno

エラー コードへのポインター。

戻り値

エラーが発生せず、操作がすぐに完了した場合、 LPWSPIoctl は 0 を返します。 この場合、完了ルーチン (指定されている場合) は既にキューに登録されていることに注意してください。 それ以外の場合は、SOCKET_ERRORの値が返され、 lpErrno で特定のエラー コードを使用できます。 エラー コード WSA_IO_PENDINGは、重複した操作が正常に開始され、完了が後で示されることを示します。 その他のエラー コードは、重複した操作が開始されておらず、完了の兆候が発生しなかったことを示します。

エラー コード 意味
WSA_IO_PENDING
重複した操作が正常に開始され、後で完了が示されます。
WSAEFAULT
lpvInBufferlpvOutBuffer、または lpcbBytesReturned パラメーターが、ユーザー アドレス空間の有効な部分に完全に含まれていないか、cbInBuffer パラメーターまたは cbOutBuffer パラメーターが小さすぎます。
WSAEINVAL
dwIoControlCode が有効なコマンドではないか、指定された入力パラメーターが受け入れられないか、指定されたソケットの種類にコマンドが適用されません。
WSAEINPROGRESS
関数は、コールバックが進行中のときに呼び出されます。
WSAENETDOWN
ネットワーク サブシステムが失敗しました。
WSAENOTSOCK
記述子 s はソケットではありません。
WSAEOPNOTSUPP
指定された IOCTL コマンドを実現できません。 たとえば、 SIO_SET_QOS で指定されたフロー仕様を満たすことはできません。
WSAEWOULDBLOCK
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。

解説

このルーチンは、ソケット、トランスポート・プロトコル、または通信サブシステムに関連付けられている操作パラメーターを設定または取得するために使用されます。 lpOverlappedlpCompletionRoutine の両方が NULL の場合、この関数のソケットは、オーバーラップされていないソケットとして扱われます。

重複していないソケットの場合、 lpOverlapped パラメーターと lpCompletionRoutine パラメーターは無視され、ソケット s がブロック モードの場合、この関数はブロックできます。 ソケット s が非ブロッキング モードの場合、指定した操作をすぐに完了できない場合、この関数は WSAEWOULDBLOCK を返すことができます。 この場合、Windows ソケット SPI クライアントは、ソケットをブロック モードに変更し、要求を再発行するか、対応するネットワーク イベント (SIO_ROUTING_INTERFACE_CHANGEやSIO_ADDRESS_LIST_CHANGEの場合はFD_ROUTING_INTERFACE_CHANGEやFD_ADDRESS_LIST_CHANGEなど) を待つ場合があります (LPWSPAsyncSelect またはイベント (LPWSPEventSelect を使用) を使用)。

重複するソケットの場合、すぐには完了できない操作が開始され、完了は後で示されます。 返される lpcbBytesReturned パラメーターが指す DWORD 値は無視できます。 最終的な完了状態と返されるバイト数は、操作の完了時に適切な完了メソッドが通知されたときに取得できます。

サービス プロバイダーの実装によっては、IOCTL が無期限にブロックされる場合があります。 Windows ソケット 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 ソケット 1.1 および UNIX コントロール コードとの下位互換性を維持しながら、新しいコントロール コードを追加するときにプロトコルとベンダーの独立性を確保するために構築されています。 dwIoControlCode パラメーターの形式は次のとおりです。

ビット 31 ビット 30 ビット 29 ビット 28 および 27 ビット 26 から 16 ビット 15 から 0
I O V T ベンダー/アドレス ファミリ コード

入力 バッファーがコードに対して有効な場合は、 IOC_INと同様に設定されます。

出力 バッファーがコードに対して有効な場合は、IOC_OUTと同様に O が設定 されます。 入力パラメーターと出力パラメーターの両方を持つコードの場合、 IO の両方が設定されることに注意してください。

IOC_VOID と同様に、コードのパラメーターがない場合は V が設定 されます

T は、IOCTL の種類を定義する 2 ビット数量です。 次の値が定義されています。

  • 0 は、 FIONREADFIONBIO などと同様に、IOCTL が標準の UNIX IOCTL コードであることを示します。
  • 1 は、IOCTL が汎用の Windows ソケット 2 IOCTL コードであることを示します。 Windows ソケット 2 に対して定義された新しい IOCTL コードには T == 1 が含まれます
  • 2 は、IOCTL が特定のアドレス ファミリにのみ適用されることを示します。
  • 3 IOCTL は、特定のベンダーのプロバイダーにのみ適用されます。 このタイプでは、仕入先 /住所ファミリ メンバーに表示される仕入先番号を会社に割り当てることができます。 その後、ベンダーは、IOCTL をクリアリングハウスに登録しなくても、そのベンダーに固有の新しい IOCTL を定義できるため、ベンダーの柔軟性とプライバシーが提供されます。

仕入先/住所ファミリは、コードを所有する仕入先 (T3 の場合) を定義する 11 ビット数量、またはコードが適用される住所ファミリ (T == == 2 の場合) を含む 11 ビット数量です。 これが UNIX IOCTL コード (T == 0) の場合、このメンバーは UNIX 上のコードと同じ値を持ちます。 これが汎用 Windows ソケット 2 IOCTL (T == 1) の場合、このメンバーをコード メンバーの拡張として使用して、追加のコード値を提供できます。

コード は、操作の特定の IOCTL コードです。

次の UNIX コマンドがサポートされています。

FIONBIO

ソケット 非ブロッキング モードを有効または無効にします。 lpvInBuffer パラメーターは符号なし long を指します。非ブロッキング モードを有効にする場合は 0 以外、無効にする場合は 0 です。 ソケットが作成されると、ブロッキング モードで動作します (つまり、非ブロッキング モードは無効になります)。 これは、バークレイソフトウェアディストリビューション(BSD)ソケットと一致しています。

LPWSPAsyncSelect ルーチンまたは LPWSPEventSelect ルーチンは、ソケットを非ブロッキング モードに自動的に設定します。 LPWSPAsyncSelect または LPWSPEventSelect がソケットで発行されている場合、LPWSPIoctl を使用してソケットをブロッキング モードに戻そうとすると、WSAEINVAL で失敗します。 ソケットをブロッキング モードに戻すには、Windows ソケット SPI クライアントが最初に LPWSPAsyncSelect を無効にする必要があります。そのためには、lEvent パラメーターを 0 に設定して LPWSPAsyncSelect を呼び出すか、lNetworkEvents パラメーターを 0 に設定して LPWSPEventSelect を呼び出して LPWSPEventSelect を無効にする必要があります。

FIONREAD

ソケットからアトミックに読み取ることができるデータの量 を決定しますlpvOutBuffer パラメーターは、WSAIoctl が結果を格納する符号なし long を指します。

s パラメーターで渡されたソケットがストリーム指向の場合 (例: SOCK_STREAM型)、FIONREAD は 1 回の受信操作で読み取ることができるデータの合計量を返します。これは通常、ソケットでキューに格納されているデータの合計量と同じです (データ ストリームはバイト指向であるため、これは保証されません)。

s パラメーターで渡されたソケットがメッセージ指向の場合 (例: SOCK_DGRAM型)、FIONREAD は、ソケットでキューに入れられた最初のデータグラム (メッセージ) のサイズではなく、読み取り可能な合計バイト数を報告します。

SIOCATMARK

すべての OOB データが読み取られたかどうかを判断します。 これは、OOB データ (SO_OOBINLINE) のインライン受信用に構成されているストリーム スタイルのソケット (たとえば、「SOCK_STREAM」と入力) にのみ適用されます。 OOB データが読み取りを待機していない場合、操作は TRUE を返します。 それ以外の場合は FALSE を返し、ソケットで次に実行される受信操作では、マークの前にあるデータの一部またはすべてを取得します。Windows ソケット SPI クライアントは 、SIOCATMARK 操作を使用して、残っているかどうかを判断する必要があります。 緊急 (OOB) データの前に通常のデータがある場合は、順番に受信されます。 (受信操作では、同じ呼び出しで OOB と通常のデータが混在することはありません。lpvOutBuffer はLPWSPIoctl が結果を格納する BOOL を指します。

次の Windows ソケット 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 ソケット SPI クライアントがバインドできるソケットのプロトコル ファミリのローカル トランスポート アドレスの一覧で変更の通知を受け取ります。 この IOCTL が完了すると、出力情報は提供されません。入力候補は、使用可能なローカル アドレスの一覧が変更され、 SIO_ADDRESS_LIST_QUERYを使用して再度クエリを実行する必要があることを示しているだけです。

Windows ソケット SPI クライアントは、要求の完了によって変更の通知を受け取るために重複した I/O を使用SIO_ADDRESS_LIST_CHANGE想定しています (必須ではありません)。 または、 SIO_ADDRESS_LIST_CHANGE IOCTL が非ブロッキング ソケットで発行され、重複するパラメーター (lpOverlappedlpCompletionRoutineNULL に設定されている) がない場合は、エラー WSAEWOULDBLOCK ですぐに完了します。 その後、Windows ソケット 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 を介してアドレス変更通知に登録できます。 次の一連のアクションを使用して、アプリケーションが常に現在のアドレス一覧情報を持っていることを保証できます。

 

  • IOCTL SIO_ADDRESS_LIST_CHANGE 問題
  • IOCTL SIO_ADDRESS_LIST_QUERY 問題
  • 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 ソケット 2 Protocol-Specific Annex の適切なセクション、および/または特定のコンパニオン インターフェイスに関するドキュメントを参照してください。 (これらのリソースは英語でのみ使用できます)。合計サイズは、入力バッファーの長さに反映されます。 出力バッファーは必要ありません。 WSAENOPROTOOPT エラー コードは、この IOCTL をサポートしていないサービス プロバイダーに対して示されます。 この IOCTL によって関連付けられているハンドルは、 SIO_TRANSLATE_HANDLEを使用して取得できます。

コンパニオン インターフェイスは、たとえば、特定のプロバイダーが提供する場合に使用できます。

  • ソケットの動作を大幅に制御できます。
  • 既存の Windows ソケット関数 (または将来の可能性が高いもの) にマップされないプロバイダー固有のコントロール。

ソケットでサポートされる他のインターフェイスを検出し、追跡するには、この IOCTL ではなく、コンポーネント オブジェクト モデル (COM: Component Object Model) を使用することをお勧めします。 この 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 をインターセプトしないでください。

出力バッファーがソケット ハンドルに十分な大きさでない ( cbOutBufferSOCKET のサイズより小さい) か 、lpvOutBuffer パラメーターが NULL ポインターである場合、 SOCKET_ERROR はこの IOCTL の結果として返され、 WSAGetLastErrorWSAEFAULT を返します。

SIO_BASE_HANDLEMswsock.h ヘッダー ファイルで定義され、Windows Vista 以降でサポートされています。

SIO_BSP_HANDLE (オペコード設定: O、T==1)

WSASendMsg 関数で使用されるソケットの基本サービス プロバイダー ハンドルを取得します。 戻り値は SOCKET です。

この Ioctl は、プロバイダーが WSASendMsg 関数を確実にインターセプトするために、階層化されたサービス プロバイダーによって使用されます。

出力バッファーがソケット ハンドルに十分な大きさでない ( cbOutBufferSOCKET のサイズより小さい) か 、lpvOutBuffer パラメーターが NULL ポインターである場合、 SOCKET_ERROR はこの IOCTL の結果として返され、 WSAGetLastErrorWSAEFAULT を返します。

SIO_BSP_HANDLEMswsock.h ヘッダー ファイルで定義され、Windows Vista 以降でサポートされています。

SIO_BSP_HANDLE_SELECT (オペコード設定: O、T==1)

select 関数で使用されるソケットの基本サービス プロバイダー ハンドルを取得します。 戻り値は SOCKET です。

この Ioctl は、プロバイダーが select 関数を確実にインターセプトするために、階層化されたサービス プロバイダーによって使用されます。

出力バッファーがソケット ハンドルに十分な大きさでない ( cbOutBufferSOCKET のサイズより小さい) か 、lpvOutBuffer パラメーターが NULL ポインターである場合、 SOCKET_ERROR はこの IOCTL の結果として返され、 WSAGetLastErrorWSAEFAULT を返します。

SIO_BSP_HANDLE_SELECTMswsock.h ヘッダー ファイルで定義され、Windows Vista 以降でサポートされています。

SIO_BSP_HANDLE_POLL (オペコード設定: O、T==1)

WSAPoll 関数で使用されるソケットの基本サービス プロバイダー ハンドルを取得します。 lpOverlapped パラメーターは NULL ポインターである必要があります。 戻り値は SOCKET です。

この Ioctl は、プロバイダーが WSAPoll 関数を確実にインターセプトするために、レイヤード サービス プロバイダーによって使用されます。

出力バッファーがソケット ハンドルに十分な大きさでない場合 ( cbOutBufferSOCKET のサイズより小さい)、 lpvOutBuffer パラメーターが NULL ポインターであるか、 lpOverlapped パラメーターが NULL ポインターではない 場合 は、この IOCTL の結果として SOCKET_ERRORが返され、 WSAGetLastErrorWSAEFAULT を返します。

SIO_BSP_HANDLE_POLLMswsock.h ヘッダー ファイルで定義され、Windows Vista 以降でサポートされています。

SIO_CHK_QOS (オペコード設定: I、O、T==3)

QoS トラフィックの特性に関する情報を取得します。 フローのセットアップと RESV メッセージの受信の間の送信側システムの移行フェーズ中 (移行フェーズの詳細については、「RSVP サービスが TC を呼び出す方法」を参照)、RSVP フローに関連付けられているトラフィックは、サービスの種類 (ベスト エフォート、制御された負荷、または 保証) に基づいて整形されます。 詳細については、プラットフォーム ソフトウェア開発キット (SDK) の「サービス品質」セクションの「SIO_CHK_QOSの使用」を参照してください。

SIO_ENABLE_CIRCULAR_QUEUEING (オペコード設定: V、T==1)

バッファー キューのオーバーフローが原因で、新しく到着したメッセージを削除してはいけないことをメッセージ指向サービス プロバイダーに示します。 代わりに、新しく到着したメッセージに対応するために、キュー内の最も古いメッセージを削除する必要があります。 入力バッファーと出力バッファーは必要ありません。 この IOCTL は、信頼性の低いメッセージ指向プロトコルに関連付けられているソケットに対してのみ有効であることに注意してください。 WSAENOPROTOOPT エラー コードは、この IOCTL をサポートしていないサービス プロバイダーに対して示されます。

SIO_FIND_ROUTE (オペコード設定: O、T==1)

この IOCTL を発行すると、入力バッファーで sockaddr として指定されたリモート アドレスへのルートを検出するように要求します。 アドレスがローカル キャッシュに既に存在する場合、そのエントリは無効になります。 Novell の IPX の場合、この呼び出しは、指定されたリモート アドレスをネットワークに照会する IPX GetLocalTarget (GLT) を開始します。

SIO_FLUSH (オペコード設定: V、T==1)

このソケットに関連付けられている送信側キューの現在の内容を破棄します。 入力バッファーと出力バッファーは必要ありません。 WSAENOPROTOOPT エラー コードは、この IOCTL をサポートしていないサービス プロバイダーに対して示されます。

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 ソケット 2 準拠の TCP/IP サービス プロバイダーでは、このコマンドのサポートが必須です。

 

lpvOutBuffer パラメーターは、インターフェイスに関する情報をインターフェイス上のユニキャスト IP アドレスのINTERFACE_INFO構造体の配列として格納するバッファーを指します。 cbOutBuffer パラメーターは、出力バッファーの長さを指定します。 返されるインターフェイスの数 ( lpvOutBuffer パラメーターによって指されるバッファーで返される構造体の数) は、 lpcbBytesReturned パラメーターで返される出力バッファーの実際の長さに基づいて決定できます。

WSAIoctl 関数が SIO_GET_INTERFACE_LIST で呼び出され、ソケット パラメーターのレベル メンバーが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 構造を含めるのに十分な大きさにする必要があります。 WSAENOPROTOOPT エラー コードは、サービスの品質をサポートしていないサービス プロバイダーに対して示されます。

SIO_IDEAL_SEND_BACKLOG_CHANGE (オペコード設定: V、T==0)

基になる接続の理想的な送信バックログ (ISB) 値が変更されたときに、アプリケーションに通知します。

Windows ソケットを使用して TCP 接続経由でデータを送信する場合は、最高のスループットを実現するために、TCP で十分な量のデータを未処理 (送信済みだが未確認) にしておくことが重要です。 TCP 接続に最適なスループットを実現するために未処理のデータ量の理想的な値は、理想的な送信バックログ (ISB) サイズと呼ばれます。 ISB 値は、TCP 接続と受信側のアドバタイズされた受信ウィンドウ (およびネットワーク内の輻輳の量の一部) の帯域幅遅延積の関数です。

接続ごとの ISB 値は、Windows Server 2008、Windows Vista 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 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 sp1 以降のバージョンのオペレーティング システムでサポートされています。

SIO_KEEPALIVE_VALS (オペコード設定: I、T==3)

TCP キープアライブ タイムアウトと間隔を指定する TCP キープアライブ オプションの接続ごとの設定を有効または無効にします。 キープアライブ オプションの詳細については、IETF Web サイトで利用可能な RFC 1122 で指定されているインターネット ホストの要件- 通信レイヤーに関するセクション 4.2.3.6 を参照してください。

SIO_KEEPALIVE_VALS を使用して、キープアライブ プローブを有効または無効にし、キープアライブ タイムアウトと間隔を設定できます。 キープアライブ タイムアウトは、最初のキープアライブ パケットが送信されるまでアクティビティなしで、タイムアウトをミリ秒単位で指定します。 キープアライブ間隔は、受信確認が受信されない場合に連続するキープアライブ パケットが送信されるまでの間隔をミリ秒単位で指定します。

SOL_SOCKET ソケット オプションの 1 つである SO_KEEPALIVE オプションを使用して、接続で TCP キープアライブを有効または無効にしたり、このオプションの現在の状態を照会したりすることもできます。 ソケットで TCP キープアライブが有効になっているかどうかを照会するには、SO_KEEPALIVE オプションを使用して getsockopt 関数を呼び出すことができます。 TCP キープアライブを有効または無効にするには、SO_KEEPALIVE オプションを使用して setsockopt 関数を呼び出すことができます。 SO_KEEPALIVEで TCP キープアライブが有効になっている場合、これらの値が SIO_KEEPALIVE_VALSを使用して変更されていない限り、既定の 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 構造体 ( cbOutBufferRSS_SCALABILITY_INFOのサイズより小さい) に十分な大きさではない場合、または lpvOutBuffer パラメーターが NULL ポインターである場合、 SOCKET_ERROR はこの IOCTL の結果として返され、 WSAGetLastErrorWSAEINVAL を返します。

1 つのシステム内に複数の CPU が存在する高速ネットワークでは、NDIS 5.1 以前のバージョンのアーキテクチャではプロトコル処理が 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 プラットフォームを利用してパススルー トラフィックを検査およびプロキシするエッジ ファイアウォールの実装があります。 インターネット セキュリティと高速化 (ISA) サーバーは、このようなエッジ デバイスの例です。

既存のエンドポイントに関連付けられている送信パスに受信パケットを挿入する機能が必要になる場合があるファイアウォール シナリオがいくつかあります。 宛先エンドポイントに関連付けられているトランスポート層エンドポイント ハンドルを検出するメカニズムが必要です。 エンドポイントを作成したアプリケーションは、これらのトランスポート層エンドポイントを所有します。 この IOCTL は、トランスポート層エンドポイント ハンドル マッピングにソケット ハンドルを提供するために使用されます。

出力バッファーがエンドポイント ハンドルに十分な大きさでない場合 ( cbOutBufferUINT64 のサイズより小さい)、 または lpvOutBuffer パラメーターが NULL ポインターである場合、 SOCKET_ERROR はこの IOCTL の結果として返され、 WSAGetLastErrorWSAEINVAL を返します。

SIO_QUERY_WFP_ALE_ENDPOINT_HANDLE は、Windows Vista 以降でサポートされています。

SIO_QUERY_PNP_TARGET_HANDLE (オペコード設定: O、T==1)

現在のソケットが PnP の意味で依存しているチェーン内の次のプロバイダーのソケット記述子を取得します。 この IOCTL は、 WPUCreateSocketHandle 呼び出しによって作成された IFS 以外のサービス プロバイダーのソケットでのみ、Windows ソケット 2 DLL によって呼び出されます。 プロバイダーは、出力バッファーで、特定のソケット ハンドルが PnP の意味で依存するチェーン内の次のプロバイダーのソケット ハンドルを返す必要があります (たとえば、基になるハンドルをサポートするデバイスを削除すると、チェーン内のハンドルの上にハンドルが無効になります)。

重複した操作が直ちに完了すると、この関数は 0 の値を返し、 lpcbBytesReturned パラメーターは出力バッファー内のバイト数で更新されます。 重複した操作が正常に開始され、後で完了する場合、この関数はSOCKET_ERRORを返し、エラー コードWSA_IO_PENDINGを示します。 この場合、 lpcbBytesReturned は更新されません。 重複する操作が完了すると、出力バッファー内のデータ量は、完了ルーチンの cbTransferred パラメーター (指定されている場合) または LPWSPGetOverlappedResultlpcbTransfer パラメーターを使用して示されます。

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 では、ネットワーク インターフェイスから送信されたローカル パケットもキャプチャされるように変更されました。 これには、別のインターフェイスで受信した後、IOCTL を使用してソケットにバインドされたネットワーク インターフェイス SIO_RCVALL 転送されたパケットが含まれます。

この 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) が生ソケットに配信されます。
このオプションでは、インターフェイス上の他のパケット (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 を使用してクエリを実行する必要があることを示しているだけです。

アプリケーションは、要求の完了によってルーティング インターフェイスの変更を通知するために重複した I/O を使用SIO_ROUTING_INTERFACE_CHANGE想定しています (必須ではありません)。 または、lpOverlapped パラメーターと lpCompletionRoutine パラメーターが NULL に設定された非ブロッキング ソケットでSIO_ROUTING_INTERFACE_CHANGE IOCTL が発行された場合、エラー WSAEWOULDBLOCK ですぐに完了し、Windows ソケット SPI クライアントは、ネットワーク イベント ビットマスクに設定されたFD_ROUTING_INTERFACE_CHANGE ビットを使用して LPWSPEventSelect または LPWSPAsyncSelect の呼び出しを使用して、変更イベントのルーティングを待機できます。

ルーティング情報はほとんどの場合安定しているため、アプリケーションが関心のあるすべての宛先に関する通知を取得するために複数の未処理の IOCTL を保持し、サービス プロバイダーにこれらの通知要求を追跡させる必要がある場合は、大量のシステム リソースが使用されます。 この状況を回避するには、入力パラメーターの意味を拡張し、次のようにサービス プロバイダーの要件を緩和します。

Windows ソケット SPI クライアントは、プロトコル ファミリ固有のワイルドカード アドレス (使用可能なアドレスへのバインドを要求するときに バインド 呼び出しで使用されるアドレスと同じ) を指定して、ルーティングの変更に関する通知を要求できます。 これにより、Windows ソケット SPI クライアントは、すべてのソケットと宛先に対して未処理 のSIO_ROUTING_INTERFACE_CHANGE を 1 つだけ保持し、 SIO_ROUTING_INTERFACE_QUERY を使用して実際のルーティング情報を取得できます。

サービス プロバイダーは、(Windows ソケット SPI クライアントがワイルドカード アドレスを指定したかのように) SIO_ROUTING_INTERFACE_CHANGE の入力バッファー内の Windows ソケット SPI クライアントによって提供される情報を無視し、ルーティング情報が変更された場合 (入力バッファーで指定された宛先へのルートだけでなく) SIO_ROUTING_INTERFACE_CHANGE IOCTL またはシグナル FD_ROUTING_INTERFACE_CHANGE イベントを完了することを選択できます。

SIO_ROUTING_INTERFACE_QUERY (オペコード設定: I、O、T==1)

入力バッファーで指定されたリモート アドレス ( sockaddr として) に送信するために使用するローカル インターフェイス ( sockaddr 構造体として表されます) のアドレスを取得します。 リモート マルチキャスト アドレスは、マルチキャスト送信用の優先インターフェイスのアドレスを取得するために、入力バッファーに送信できます。 いずれの場合も、返されるインターフェイス アドレスは、後続の Bind 要求でアプリケーションによって使用される場合があります。

ルートは変更される可能性があることに注意してください。 したがって、Windows ソケット SPI クライアントは、 SIO_ROUTING_INTERFACE_QUERY によって返される情報に依存して永続的にすることはできません。 SPI クライアントは、 SIO_ROUTING_INTERFACE_CHANGE IOCTL を使用して変更通知をルーティングするために登録できます。これにより、重複した I/O またはFD_ROUTING_INTERFACE_CHANGE イベントを介した通知が提供されます。 次の一連のアクションを使用して、Windows ソケット SPI クライアントが特定の宛先の現在のルーティング インターフェイス情報を常に持っていることを保証できます。

  • IOCTL SIO_ROUTING_INTERFACE_CHANGE 問題。
  • IOCTL SIO_ROUTING_INTERFACE_QUERY 問題。
  • IOCTL SIO_ROUTING_INTERFACE_CHANGE WinSock SPI クライアントにルーティングの変更 (重複した I/O またはFD_ROUTING_INTERFACE_CHANGE イベントの通知) を通知するたびに、アクションのシーケンス全体を繰り返す必要があります。

出力バッファーがインターフェイス アドレスを格納するのに十分な大きさでない場合は、この IOCTL の結果としてSOCKET_ERRORが返され、 WSAGetLastError はWSAEFAULT を返します。 この場合、出力バッファーの必要なサイズは lpcbBytesReturned で返されます。 lpvInBuffer、lpvOutBuffer、または lpcbBytesReturned パラメーターがユーザー アドレス空間の有効な部分に完全に含まれていない場合は、WSAEFAULT エラー コードも返されることに注意してください。

入力バッファーで指定された宛先アドレスに使用可能なインターフェイスを介して到達できない場合は、この IOCTL の結果としてSOCKET_ERRORが返され、 WSAGetLastErrorWSAENETUNREACH 、またはすべてのネットワーク接続が失われた場合は 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 以降の値に設定されている場合、TCP 接続が確立された後でも、SO_RCVBUF ソケット オプションを使用して、このソケットの TCP 受信バッファー サイズを減らすことが許可されます。
TargetOsVersion メンバーが Windows Vista より前の値に設定されている場合、SO_RCVBUF ソケット オプションを使用して、このソケットの TCP 受信バッファー サイズの削減は、接続の確立後に許可されません。
WsaBehaviorAutoTuning
TargetOsVersion メンバーが Windows Vista 以降の値に設定されている場合、受信ウィンドウの自動チューニングが有効になり、TCP ウィンドウスケールファクターが既定値の 8 から 2 に減ります。
TargetOsVersion が Windows Vista より前の値に設定されている場合、受信ウィンドウの自動チューニングは無効になります。 TCP ウィンドウのスケーリング オプションも無効になっており、true の受信ウィンドウの最大サイズは 65,535 バイトに制限されています。 接続が確立される前に 65,535 バイトを超える値を指定して、このソケットで SO_RCVBUF ソケット オプションが呼び出された場合でも、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 構造体は入力バッファーから取得されます。 WSAENOPROTOOPT エラー コードは、サービスの品質をサポートしていないサービス プロバイダーに対して示されます。

SIO_TRANSLATE_HANDLE (オペコード設定: I、O、T==1)

コンパニオン インターフェイスのコンテキストで有効なソケット 対応するハンドルを取得するには (たとえば、TH_NETDEVとTH_TAPI)。 コンパニオン インターフェイスとその他の必要なパラメーターを識別するマニフェスト定数は、入力バッファーで指定されます。 この関数が完了すると、対応するハンドルが出力バッファーで使用できるようになります。 詳細については、 Windows ソケット 2 Protocol-Specific Annex の適切なセクション、および/または特定のコンパニオン インターフェイスに関するドキュメントを参照してください。 WSAENOPROTOOPT エラー コードは、指定されたコンパニオン インターフェイスに対してこの IOCTL をサポートしていないサービス プロバイダーに対して示されます。 この IOCTL は、 SIO_TRANSLATE_HANDLEを使用して関連付けられているハンドルを取得します。

この IOCTL の代わりに COM を使用して、ソケットでサポートされる可能性がある他のインターフェイスを検出して追跡することをお勧めします。 この IOCTL は、COM が使用できない、または何らかの理由で使用できないシステムとの下位互換性のために存在します。

SIO_UDP_CONNRESET (オペコード設定: I、T==3)

Windows XP: UDP PORT_UNREACHABLE メッセージを報告するかどうかを制御します。 レポートを有効にするには 、TRUE に設定します。 レポートを無効にするには 、FALSE に設定します。

重複するソケットを使用して呼び出される場合、 lpOverlapped パラメーターは、重複する操作の間有効である必要があります。

lpCompletionRoutine パラメーターが NULL の場合、有効なイベント オブジェクト ハンドルが含まれている場合、重複した操作が完了すると、サービス プロバイダーは lpOverlappedhEvent メンバーに通知します。 Windows ソケット SPI クライアントは、 LPWSPGetOverlappedResult を使用して、イベント オブジェクトをポーリングまたは待機できます。

lpCompletionRoutineNULL でない場合、hEvent メンバーは無視され、Windows ソケット SPI クライアントがコンテキスト情報を完了ルーチンに渡すために使用できます。 NULL 以外の lpCompletionRoutine を渡し、同じ重複した I/O 要求に対して WSAGetOverlappedResult を呼び出すクライアントでは、WSAGetOverlappedResult の呼び出しに対して fWait パラメーターを TRUE に設定することはできません。 この場合、 hEvent メンバーの使用は未定義であり、 hEvent メンバーを待機しようとすると予測できない結果が生成されます。

サービス プロバイダーは、重複した操作が完了したときに、クライアント指定完了ルーチンの呼び出しを手配する必要があります。 完了ルーチンは、重複した操作を開始したのと同じスレッドのコンテキストで実行する必要があるため、サービス プロバイダーから直接呼び出すことはできません。 WS2_32.DLL は、完了ルーチンの呼び出しを容易にする非同期プロシージャ 呼び出し (APC) メカニズムを提供します。

サービス プロバイダーは、 WPUQueueApc を呼び出すことによって、適切なスレッドとプロセス コンテキストで実行される関数を配置します。 この関数は、重複した操作を開始するために使用されたスレッドとプロセスとは異なるコンテキストであっても、任意のプロセスとスレッド コンテキストから呼び出すことができます。

WPUQueueApc は、入力パラメーターとして WSATHREADID 構造体へのポインター ( lpThreadId 入力パラメーターを介してプロバイダーに提供)、呼び出される APC 関数へのポインター、および後で APC 関数に渡される 32 ビット コンテキスト値を受け取ります。 1 つの 32 ビット コンテキスト値しか使用できないため、APC 関数自体をクライアント指定完了ルーチンにすることはできません。 サービス プロバイダーは、代わりに、指定されたコンテキスト値を使用して重複する操作に必要な結果情報にアクセスし、クライアント指定完了ルーチンを呼び出す独自の APC 関数へのポインターを指定する必要があります。

クライアント指定の完了ルーチンのプロトタイプは次のとおりです。

);

CompletionRoutine は、クライアントが提供する関数のプレースホルダーです。 dwError は、lpOverlapped で示されているように、重複する操作の完了状態を指定します。 cbTransferred は、返されるバイト数を指定します。 現在、フラグ値は定義されておらず、 dwFlags は 0 になります。 この関数は値を返しません。

この関数から戻って、このソケットに対して別の保留中の完了ルーチンを呼び出すことができます。 完了ルーチンは任意の順序で呼び出すことができますが、重複する操作が完了した順序と同じ順序であるとは限りません。

互換性

T == 0 の IOCTL コードは、Berkeley ソケットで使用される IOCTL コードのサブセットです。 特に、FIOASYNC と同等のコマンドはありません。

注意

特定のスレッドによって開始されたすべての I/O は、そのスレッドが終了すると取り消されます。 重複するソケットの場合、保留中の非同期操作は、操作が完了する前にスレッドが閉じられた場合に失敗する可能性があります。 詳細については、「 ExitThread 」を参照してください。

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
Header ws2spi.h

関連項目

WPUQueueApc

LPWSPGetSockopt

LPWSPSetSockOpt

LPWSPSocket