WSAIoctl 関数 (winsock2.h)

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

構文

int WSAAPI WSAIoctl(
  [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] s

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

[in] dwIoControlCode

実行する操作の制御コード。 Winsock IOCTLを参照してください。

[in] lpvInBuffer

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

[in] cbInBuffer

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

[out] lpvOutBuffer

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

[in] cbOutBuffer

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

[out] lpcbBytesReturned

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

[in] lpOverlapped

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

[in] lpCompletionRoutine

型: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

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

戻り値

正常に完了すると、WSAIoctl は 0 を返します。 それ以外の場合は、SOCKET_ERRORの値が返され、WSAGetLastError呼び出すことによって特定のエラー コードを取得できます。

エラー コード 意味
WSA_IO_PENDING
重複する操作が正常に開始され、完了は後で示されます。
WSAENETDOWN の
ネットワーク サブシステムが失敗しました。
WSAEFAULT の
lpvInBufferlpvOutBufferlpcbBytesReturnedlpOverlapped、または lpCompletionRoutine パラメーター は、ユーザー アドレス空間の有効な部分に完全に含まれていません。 または、cbInBuffer または cbOutBuffer パラメーター が小さすぎます。
WSAEINVAL の
dwIoControlCode パラメーターが有効なコマンドではないか、指定された入力パラメーターが受け入れられないか、指定されたソケットの型にコマンドが適用されません。
WSAEINPROGRESS を する
この関数は、コールバックが進行中のときに呼び出されます。
WSAENOTSOCK の
記述子はソケットではありません。
WSAEOPNOTSUPP の
指定された IOCTL コマンドを実現できません。 (たとえば、SIO_SET_QOS または SIO_SET_GROUP_QOS で指定された FLOWSPEC 構造体は満たされません)。
WSAEWOULDBLOCK を する
ソケットは非ブロッキングとしてマークされ、要求された操作はブロックされます。
WSAENOPROTOOPT の
ソケット オプションは、指定されたプロトコルではサポートされていません。 たとえば、IPv6 ソケットで SIO_GET_BROADCAST_ADDRESS IOCTL を使用しようとしましたが、データグラム ソケットで TCP SIO_KEEPALIVE_VALS IOCTL を使用しようとしました。

備考

WSAIoctl 関数は、ソケット、トランスポート プロトコル、または通信サブシステムに関連付けられている操作パラメーターを設定または取得するために使用されます。

lpOverlapped lpCompletionRoutine の両方が NULL場合、この関数のソケットは重複していないソケットとして扱われます。 重複していないソケットの場合、lpOverlapped と lpCompletionRoutine パラメーター は無視されます。これにより、関数は標準の ioctlsocket 関数と同様に動作しますが、ソケット がブロック モードの場合は関数がブロックできます。 ソケット が非ブロッキング モードの場合、指定した操作をすぐに完了できないときに、この関数は WSAEWOULDBLOCK を返すことができます。 この場合、アプリケーションは、Windows メッセージ (WSAAsyncSelectを使用) またはイベント (WSAEventSelectを 使用) ベースのイベントを使用して、ソケットをブロック モードに変更し、対応するネットワーク イベント (SIO_ROUTING_INTERFACE_CHANGESIO_ADDRESS_LIST_CHANGEの場合はFD_ROUTING_INTERFACE_CHANGEやFD_ADDRESS_LIST_CHANGEなど) を待つ場合があります (WSAEventSelect使用)。

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

サービス プロバイダーの実装によっては、IOCTL が無期限にブロックされる場合があります。 アプリケーションが WSAIoctl 呼び出しでのブロックを許容できない場合は、特にブロックする可能性が高い 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 パラメーターが指す完了ルーチンのプロトタイプは次のとおりです。

#ifndef UNICODE
#define UNICODE
#endif

#define WIN32_LEAN_AND_MEAN

#include <winsock2.h>
#include <Ws2tcpip.h>
#include <stdio.h>

// Link with ws2_32.lib
#pragma comment(lib, "Ws2_32.lib")


void CALLBACK CompletionRoutine (
  IN DWORD dwError,
  IN DWORD cbTransferred,
  IN LPWSAOVERLAPPED lpOverlapped,
  IN DWORD dwFlags 
);

CompletionRoutine は、アプリケーションが指定した関数名のプレースホルダーです。 dwError パラメーターは、lpOverlapped パラメーターで示されているように、重複する操作の完了状態 指定します。 cbTransferred パラメーターは、受信したバイト数を指定します。 dwFlags パラメーターは、この IOCTL には使用されません。 完了ルーチンは値を返しません。

現在定義されている ioctlsocket オペコード を保持するエンコード スキームを採用すると同時に、dwIoControlCode パラメーターが 32 ビット エンティティである限り、オペコード識別子領域をパーティション分割する便利な方法を提供できます。 dwIoControlCode パラメーターは、Windows Sockets 1.1 および Unix コントロール コードとの下位互換性を維持しながら、新しいコントロール コードを追加するときにプロトコルとベンダーの独立を可能にするために構築されています。 dwIoControlCode パラメーターの形式は次のとおりです。

O V T ベンダー/住所ファミリ コード
3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
 
メモ テーブルに表示 される dwIoControlCode パラメーターのビットは、列ごとに上下に読み取る必要があります。 そのため、左端のビットはビット 31、次のビットはビット 30、右端のビットはビット 0 です。
 
IOC_INと同様に、入力バッファーがコードに対して有効な場合は設定されます。

O は、IOC_OUTと同様に、出力バッファーがコードに対して有効な場合に設定されます。 入力バッファーと出力バッファーの両方を使用する制御コードは、I と O の両方を設定します。

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

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

0 IOCTL は、FIONREAD および FIONBIOと同様に、標準的な Unix IOCTL コードです。

1 IOCTL は、汎用の Windows ソケット 2 IOCTL コードです。 Windows ソケット 2 に対して定義された新しい IOCTL コードには、T == 1 が含まれます。

2 IOCTL は、特定のアドレス ファミリにのみ適用されます。

3 IOCTL は、IOC_VENDORと同様に、特定のベンダーのプロバイダーにのみ適用されます。 このタイプでは、会社に、仕入先/住所ファミリの パラメータに表示される仕入先番号を割り当てることができます。 その後、ベンダーは、クリアリングハウスに IOCTL を登録しなくても、そのベンダーに固有の新しい IOCTL を定義できるため、ベンダーの柔軟性とプライバシーが提供されます。

ベンダー/住所ファミリ コードを所有するベンダーを定義する 11 ビット数量(T == 3 の場合)、またはコードが適用されるアドレス ファミリ (T == 2 の場合) を含む 11 ビット数量です。 これが Unix IOCTL コード (T == 0) の場合、このパラメーターの値は Unix 上のコードと同じです。 これが汎用 Windows ソケット 2 IOCTL (T == 1) の場合、このパラメーターをコード パラメーターの拡張として使用して、追加のコード値を指定できます。

コード 操作の特定の IOCTL コードを含む 16 ビットの数量。

次の Unix IOCTL コード (コマンド) がサポートされています。

次の Windows ソケット 2 コマンドがサポートされています。

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

重複するソケットを使用して呼び出された場合、lpOverlapped パラメーター は、重複する操作の間有効である必要があります。 lpOverlapped パラメーターには、WSAOVERLAPPED 構造体のアドレスが含まれています。

lpCompletionRoutine パラメーターが NULL場合、重複した操作が完了したときに、lpOverlappedhEvent パラメーターが通知されます (有効なイベント オブジェクト ハンドルが含まれている場合)。 アプリケーションは、WSAWaitForMultipleEvents 使用することも、WSAGetOverlappedResultしてイベント オブジェクトを待機またはポーリングすることもできます。

特定のスレッドによって開始されたすべての I/O、そのスレッドが終了すると取り消されることに注意してください。 重複するソケットの場合、保留中の非同期操作は、操作が完了する前にスレッドが閉じられた場合に失敗する可能性があります。 詳細については、「ExitThread の を参照してください。
 
lpCompletionRoutine NULLされていない場合、hEvent パラメーターは無視され、アプリケーションがコンテキスト情報を完了ルーチンに渡すために使用できます。 以外の NULLlpCompletionRoutine を渡し、同じ重複 I/O 要求 WSAGetOverlappedResult を後で呼び出す呼び出し元は、WSAGetOverlappedResult の呼び出しに対して fWait パラメーターを設定して TRUEを することはできません。 この場合、hEvent パラメーターの使用は未定義であり、hEvent パラメーターを待機しようとすると、予測できない結果が発生します。

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


void CALLBACK CompletionRoutine(
  IN DWORD dwError, 
  IN DWORD cbTransferred, 
  IN LPWSAOVERLAPPED lpOverlapped, 
  IN DWORD dwFlags 
);

この CompletionRoutine は、アプリケーション定義関数またはライブラリ定義関数のプレースホルダーです。 完了ルーチンは、スレッドが警告可能な状態にある場合にのみ呼び出されます。 スレッドをアラート可能な状態にするには、WSAWaitForMultipleEventsWaitForSingleObjectExまたは waitForMultipleObjectsEx 関数を使用し、fAlertable または bAlertable パラメーターを TRUEに設定します。

CompletionRoutinedwError パラメーターは、lpOverlappedで示されているように、重複する操作の完了状態 指定します。 cbTransferred パラメーターは、返されるバイト数を指定します。 現在、フラグ値は定義されておらず、dwFlags 0 になります。 CompletionRoutine 関数は値を返しません。

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

互換性

T == 0 の IOCTL コードは、バークレイ ソケットで使用される IOCTL コードのサブセットです。 特に、FIOASYNC
と同等のコマンドはありません。
一部の IOCTL コードには、追加のヘッダー ファイルが必要です。 たとえば、SIO_RCVALL IOCTL を使用するには、Mstcpip.h ヘッダー ファイルが必要です。
 
Windows Phone 8: この機能は、Windows Phone 8 以降の Windows Phone ストア アプリでサポートされています。

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

必要条件

要件 価値
サポートされる最小クライアント Windows 8.1、Windows Vista [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー winsock2.h
ライブラリ Ws2_32.lib
DLL Ws2_32.dll

関連項目

SOL_SOCKET ソケット オプションの

WSASocket の

Winsock Functions

Winsock リファレンス

getsockopt

ioctlsocket を する

setsockopt

ソケット