다음을 통해 공유


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
);

매개 변수

소켓을 식별하는 설명자입니다.

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 구조체에 대한 포인터입니다.

소켓 겹치는 특성 없이 만들어진 경우 lpOverlapped 매개 변수는 무시됩니다.

겹치는 특성으로 열렸고 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 설명자 소켓이 아닙니다.
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 원시 소켓을 참조하세요.

또한 소켓은 명시적 로컬 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에서는 네트워크 인터페이스에서 전송된 로컬 패킷도 캡처되도록 변경되었습니다. 여기에는 다른 인터페이스에서 수신한 다음 SIO_RCVALL IOCTL을 사용하여 소켓에 바인딩된 네트워크 인터페이스를 전달한 패킷이 포함됩니다.

이 IOCTL을 설정하려면 로컬 컴퓨터에 대한 관리자 권한이 필요합니다.

이 기능을 난잡한 모드라고도 합니다. 이 IOCTL을 사용하여 한 인터페이스에서 이 옵션을 적용한 다음 단일 호출로 다른 인터페이스로의 직접적인 변경은 지원되지 않습니다. 애플리케이션은 먼저 이 IOCTL을 사용하여 첫 번째 인터페이스에서 동작을 끈 다음 이 IOCTL을 사용하여 새 인터페이스에서 동작을 사용하도록 설정해야 합니다.

추가 정보

소켓

TCP/IP 원시 소켓

WSAGetLastError

WSAGetOverlappedResult

WSAIoctl

WSAOVERLAPPED

WSASocketA

WSASocketW