SIO_RCVALL 制御コード

説明

SIO_RCVALL制御コードを使用すると、ソケットはネットワーク インターフェイスを通過するすべての IPv4 または IPv6 パケットを受信できます。

この操作を実行するには、次のパラメーターを指定して WSAIoctl または WSPIoctl 関数を呼び出します。

int WSAIoctl(
  (socket) s,            // descriptor identifying a socket
  SIO_RCV_ALL,                       // dwIoControlCode
  NULL,                              // lpvInBuffer
  0,                                 // cbInBuffer
  NULL,                              // lpvOutBuffer output buffer
  (DWORD) cbOutBuffer,            // size of output buffer  
  (LPDWORD) lpcbBytesReturned,    // number of bytes returned
  (LPWSAOVERLAPPED) lpOverlapped, // OVERLAPPED structure
  (LPWSAOVERLAPPED_COMPLETION_ROUTINE) lpCompletionRoutine,  // completion routine
);

パラメーター

s

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

dwIoControlCode

操作の制御コード。 この操作 にはSIO_RCVALL を使用します。

lpvInBuffer

オプション値を格納する必要がある入力バッファーへのポインター。 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 パケットなど) はキャプチャされません。

cbInBuffer

入力バッファーのサイズ (バイト単位)。 このパラメーターは、lpvInBuffer パラメーターが指すRCVALL_VALUE列挙値のサイズ以上である必要があります。

lpvOutBuffer

出力バッファーへのポインター。 このパラメーターは、この操作では使用されません。

cbOutBuffer

出力バッファーのサイズ (バイト単位)。 このパラメーターは、この操作では使用されません。

lpcbBytesReturned

出力バッファーに格納されているデータのサイズ (バイト単位) を受け取る変数へのポインター。 このパラメーターは、この操作では使用されません。

lpvOverlapped

WSAOVERLAPPED 構造体へのポインター。

重複する属性なしでソケット s が作成された場合、 lpOverlapped パラメーターは無視されます。

重複した属性を使用して s を開き、 lpOverlapped パラメーターが NULL でない場合、操作は重複 (非同期) 操作として実行されます。 この場合、 lpOverlapped パラメーターは有効な WSAOVERLAPPED 構造体を指している必要があります。

重複する操作の場合、 WSAIoctl または WSPIoctl 関数は直ちに戻り、操作が完了すると適切な完了メソッドが通知されます。 それ以外の場合、関数は操作が完了するかエラーが発生するまで戻りません。

lpCompletionRoutine

種類: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE

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

lpThreadId

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

メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。

lpErrno

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

メモ このパラメーターは 、WSPIoctl 関数にのみ適用されます。

戻り値

操作が正常に完了すると、 WSAIoctl または WSPIoctl 関数は 0 を返します。

操作が失敗した場合、または保留中の場合、 WSAIoctl または WSPIoctl 関数は SOCKET_ERRORを返します。 拡張エラー情報を取得するには、 WSAGetLastError を呼び出します。

エラー コード 意味
WSA_IO_PENDING 重複した操作が正常に開始され、後で完了が示されます。
WSA_OPERATION_ABORTED ソケットのクローズまたは SIO_FLUSH IOCTL コマンドの実行により、重複した操作が取り消されました。
WSAEFAULT lpOverlapped または lpCompletionRoutine パラメーターは、ユーザー アドレス空間の有効な部分に完全には含まれていません。
WSAEINPROGRESS 関数は、コールバックが進行中のときに呼び出されます。
WSAEINTR ブロック操作が中断されました。
WSAEINVAL dwIoControlCode パラメーターが有効なコマンドではないか、指定した入力パラメーターが受け入れられないか、指定されたソケットの型にコマンドが適用されません。 このエラーは、 cbInBuffer パラメーターが より sizeof(UCHAR) 小さい場合、または lpvInBuffer パラメーターが RCVALL_VALUE 列挙値ではない値を指している場合にも返されます。 このエラーは、ソケットに関連付けられているネットワーク インターフェイスが見つからない場合にも返されます。 これは、ソケットに関連付けられているネットワーク インターフェイスが削除または削除された場合に発生する可能性があります (PCMCIA または USB ネットワーク デバイスの削除など)。
WSAENETDOWN ネットワーク サブシステムが失敗しました。
WSAENOBUFS 使用できるバッファー領域がありません。
WSAENOPROTOOPT ソケット オプションは、指定されたプロトコルではサポートされていません。
WSAENOTSOCK 記述子 s はソケットではありません。
WSAEOPNOTSUPP 指定された IOCTL コマンドはサポートされていません。 このエラーは、 SIO_RCVALL IOCTL がトランスポート プロバイダーでサポートされていない場合に返されます。

解説

SIO_RCVALL IOCTL は、Windows 2000 以降のバージョンのオペレーティング システムでサポートされています。

SIO_RCVALL IOCTL を使用すると、ソケットはネットワーク インターフェイス上のすべての IPv4 または IPv6 パケットを受信できます。 WSAIoctl または WSPIoctl 関数に渡されるソケット ハンドルは、次のいずれかである必要があります。

  • アドレス ファミリを AF_INET に設定し、ソケットの種類を SOCK_RAW に設定し、プロトコルを IPPROTO_IP に設定して作成された IPv4 ソケット。
  • アドレス ファミリが AF_INET6 に設定され、ソケットの種類が SOCK_RAW に設定され、プロトコルが IPPROTO_IPV6 に設定された状態で作成された IPv6 ソケット。

生ソケットの詳細については、「 TCP/IP Raw Sockets」を参照してください。

ソケットは、明示的なローカル IPv4 または IPv6 インターフェイスにもバインドする必要があります。つまり、 INADDR_ANY または in6addr_anyにバインドすることはできません。

ソケットがバインドされ、IOCTL が正常に完了すると、 WSARecv 関数または recv 関数の呼び出しは、指定された IPv4 インターフェイスを通過する IPv4 データグラムを返すか、指定された IPv6 インターフェイスを通過する IPv6 データグラムを返します。 十分に大きなバッファーを指定する必要があることに注意してください。 この IOCTL を設定すると、特定のインターフェイス上の IPv4 または IPv6 パケットのみがキャプチャされます。 この IOCTL では、インターフェイス上の他のパケット (ARP、IPX、NetBEUI パケットなど) はキャプチャされません。

SIO_RCVALL IOCTL を使用して特定のローカル インターフェイスにバインドされたソケットは、そのインターフェイスを通過するパケットのみを受信します。 別のインターフェイスで受信したパケットを受信せず、SIO_RCVALL IOCTL でバインドされたソケットとは異なる別 インターフェイスで転送されます。

Windows Server 2008 以前では、 SIO_RCVALL IOCTL 設定では、ネットワーク インターフェイスから送信されたローカル パケットはキャプチャされません。 これには、別のインターフェイスで受信され、 SIO_RCVALL IOCTL に指定されたネットワーク インターフェイスが転送されたパケットが含まれていました。

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

この IOCTL を設定するには、ローカル コンピューターの管理者特権が必要です。

この機能は、無差別モードと呼ばれることもあります。 1 つのインターフェイスでこのオプションを適用してから、この IOCTL を使用して 1 回の呼び出しで別のインターフェイスに直接変更することはサポートされていません。 アプリケーションでは、最初にこの IOCTL を使用して最初のインターフェイスで動作をオフにしてから、この IOCTL を使用して新しいインターフェイスで動作を有効にする必要があります。

関連項目

ソケット

TCP/IP 未加工ソケット

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW