다음을 통해 공유


SO_CONDITIONAL_ACCEPT 소켓 옵션

SO_CONDITIONAL_ACCEPT 소켓 옵션은 애플리케이션이 수신 대기 소켓에서 들어오는 연결을 허용할지 여부를 결정할 수 있도록 설계되었습니다.

소켓 옵션 값

이 소켓 옵션을 나타내는 상수는 0x3002.

구문

int setsockopt(
  (SOCKET) s,      // descriptor identifying a socket 
  (int) SOL_SOCKET,   // level
  (int) SO_CONDITIONAL_ACCEPT, // optname
  (char *) optval,         // input buffer,
  (int) optlen,       // size of input buffer
);

매개 변수

s [in]

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

level [in]

옵션이 정의된 수준입니다. 이 작업에 는 SOL_SOCKET 사용합니다.

optname [in]

값을 설정할 소켓 옵션입니다. 이 작업에 는 SO_CONDITIONAL_ACCEPT 사용합니다.

optval [out]

설정할 옵션의 값을 포함하는 버퍼에 대한 포인터입니다. 이 매개 변수는 DWORD 값의 크기보다 크거나 같은 버퍼를 가리킵니다.

이 값은 FALSE (사용 안 함)를 나타내는 데 사용되는 0과 TRUE (사용)를 나타내는 0이 아닌 값이 있는 부울 값으로 처리됩니다.

optlen [in, out]

옵트발 버퍼의 크기(바이트)에 대한 포인터입니다. 이 크기는 DWORD 값의 크기와 같거나 커야 합니다.

반환 값

작업이 성공적으로 완료되면 setsockopt 는 0을 반환합니다.

작업이 실패하면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEFAULT
optval 또는 optlen 매개 변수 중 하나는 사용자 주소 공간의 유효한 부분에 없는 메모리를 가리킵니다. optlen 매개 변수가 가리키는 값이 DWORD 값의 크기보다 작은 경우에도 이 오류가 반환됩니다.
WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
수준 매개 변수를 알 수 없거나 잘못되었습니다. 소켓이 이미 수신 대기 상태인 경우에도 이 오류가 반환됩니다.
WSAENOPROTOOPT
옵션은 표시된 프로토콜 패밀리에서 알 수 없거나 지원되지 않습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.

 

설명

SO_CONDITIONAL_ACCEPT 소켓 옵션을 사용하여 호출된 setsockopt 함수를 사용하면 애플리케이션이 수신 대기 소켓에서 들어오는 연결을 허용할지 여부를 결정할 수 있습니다. 소켓에 대한 조건부 수락 옵션은 기본적으로 사용하지 않도록 설정됩니다( FALSE로 설정).

이 소켓 옵션을 사용하도록 설정하면 TCP 스택이 자동으로 연결을 수락하지 않습니다. 애플리케이션이 WSAAccept 함수에 등록된 조건부 수락 콜백을 통해 연결을 수락함을 나타내기 위해 대기합니다. 연결 요청이 수신되면 Winsock은 애플리케이션에서 등록된 조건부 수락 콜백을 호출합니다. 조건부 수락 콜백이 CF_ACCEPT 반환되는 경우에만 Winsock은 전송에 연결을 완전히 수락하도록 알립니다.

SO_CONDITIONAL_ACCEPT 소켓 옵션을 사용(TRUE로 설정)으로 설정하면 소켓에 다음과 같은 몇 가지 부작용이 발생합니다.

  • 이렇게 하면 애플리케이션이 이제 연결을 수락하는 소유권을 가지기 때문에 TCP 스택의 기본 제공 SYN 공격 보호 방어가 비활성화됩니다.
  • 이렇게 하면 수신 대기 소켓을 대신하여 연결이 허용되지 않으므로 수신 대기 백로그가 효과적으로 비활성화됩니다. 애플리케이션이 CF_ACCEPT 메커니즘을 사용하여 완전히 수락할 때까지 연결이 완전히 수락되지 않습니다.
  • 즉, 애플리케이션은 연결을 수락하기 위해 수락 콜백을 쉽게 처리할 수 있도록 항상 상태에 있어야 합니다. 애플리케이션이 다른 처리를 수행하는 데 사용 중인 경우 애플리케이션이 실제로 연결을 수락하기 전에 클라이언트 쪽에 시간이 초과될 수 있습니다. 이로 인해 클라이언트 환경이 저하됩니다.

일반적으로 애플리케이션이 조건부 수락을 사용하는 기본 이유는 연결 클라이언트에서 사용하는 원본 IP 주소 또는 포트를 검사한 다음 연결을 수락하거나 거부하기로 결정하는 것입니다. 그러나 SO_CONDITIONAL_ACCEPT 옵션을 사용하도록 설정하지 않고 애플리케이션에서 TCP 스택 및 수신 대기 백로그가 예상대로 작동하도록 허용하는 경우 애플리케이션의 성능이 향상될 수 있습니다. 그런 다음 애플리케이션이 허용된 연결을 처리할 때 부적절한 IP 원본 주소 또는 포트에서 온 경우 애플리케이션이 소켓을 닫을 수 있습니다. 이 동작의 보안 단점은 애플리케이션이 이전에 허용된 연결을 강제로 닫은 이후 클라이언트가 IP 주소 및 포트에서 수신 대기 중임을 확인하는 것입니다. 그러나 SO_CONDITIONAL_ACCEPT 사용하도록 설정하는 단점은 일반적으로 이 제한보다 큽니다.

SO_CONDITIONAL_ACCEPT 소켓 옵션을 사용하여 호출된 getsockopt 함수를 사용하면 일반적으로 사용되지 않는 기능이지만 애플리케이션에서 조건부 수락 옵션의 현재 상태를 검색할 수 있습니다. 애플리케이션이 소켓에서 조건부 수락을 사용하도록 설정해야 하는 경우 setsockopt 함수를 호출하여 옵션을 사용하도록 설정합니다.

Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

요구 사항

요구 사항
지원되는 최소 클라이언트
Windows Vista [데스크톱 앱만 해당]
지원되는 최소 서버
Windows Server 2008 [데스크톱 앱만 해당]
헤더
Ws2def.h(Winsock2.h 포함)

추가 정보

getsockopt

setsockopt

WSAAccept