다음을 통해 공유


WSASocketW 함수(winsock2.h)

WSASocket 함수는 특정 전송 서비스 공급자에 바인딩된 소켓을 만듭니다.

구문

SOCKET WSAAPI WSASocketW(
  [in] int                 af,
  [in] int                 type,
  [in] int                 protocol,
  [in] LPWSAPROTOCOL_INFOW lpProtocolInfo,
  [in] GROUP               g,
  [in] DWORD               dwFlags
);

매개 변수

[in] af

주소 패밀리 사양입니다. 주소 패밀리에 사용할 수 있는 값은 Winsock2.h 헤더 파일에 정의되어 있습니다.

Windows Vista 이상용으로 릴리스된 Windows SDK 헤더 파일의 organization 변경되었으며 주소 패밀리에 대한 가능한 값은 Ws2def.h 헤더 파일에 정의되어 있습니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

현재 지원되는 값은 IPv4 및 IPv6의 인터넷 주소 패밀리 형식인 AF_INET 또는 AF_INET6. 주소 패밀리에 대한 다른 옵션(예: NetBIOS에서 사용할 AF_NETBIOS)은 주소 패밀리에 대한 Windows 소켓 서비스 공급자가 설치된 경우 지원됩니다. AF_ 주소 패밀리 및 PF_ 프로토콜 패밀리 상수의 값은 동일하므로(예: AF_INETPF_INET) 두 상수를 모두 사용할 수 있습니다.

아래 표에는 주소 패밀리에 대한 공통 값이 나와 있지만 다른 많은 값이 가능합니다.

Af 의미
AF_UNSPEC
0
주소 패밀리는 지정되지 않습니다.
AF_INET
2
IPv4(인터넷 프로토콜 버전 4) 주소 패밀리입니다.
AF_IPX
6
IPX/SPX 주소 패밀리입니다. 이 주소 패밀리는 NWLink IPX/SPX NetBIOS 호환 전송 프로토콜이 설치된 경우에만 지원됩니다.

이 주소 패밀리는 Windows Vista 이상에서 지원되지 않습니다.

AF_APPLETALK
16
AppleTalk 주소 패밀리입니다. 이 주소 패밀리는 AppleTalk 프로토콜이 설치된 경우에만 지원됩니다.

이 주소 패밀리는 Windows Vista 이상에서 지원되지 않습니다.

AF_NETBIOS
17
NetBIOS 주소 패밀리입니다. 이 주소 패밀리는 NetBIOS용 Windows 소켓 공급자가 설치된 경우에만 지원됩니다.

NetBIOS용 Windows 소켓 공급자는 32비트 버전의 Windows에서 지원됩니다. 이 공급자는 기본적으로 32비트 버전의 Windows에 설치됩니다.

NetBIOS용 Windows 소켓 공급자는 Windows 7, Windows Server 2008, Windows Vista, Windows Server 2003 또는 Windows XP를 포함한 64비트 버전의 Windows에서 지원되지 않습니다.

NetBIOS용 Windows 소켓 공급자는 형식 매개 변수가 SOCK_DGRAM 설정된 소켓만 지원합니다.

NetBIOS용 Windows 소켓 공급자는 NetBIOS 프로그래밍 인터페이스와 직접 관련이 없습니다. NetBIOS 프로그래밍 인터페이스는 Windows Vista, Windows Server 2008 이상에서 지원되지 않습니다.

AF_INET6
23
IPv6(인터넷 프로토콜 버전 6) 주소 패밀리입니다.
AF_IRDA
26
IrDA(적외선 데이터 연결) 주소 패밀리입니다.

이 주소 패밀리는 컴퓨터에 적외선 포트와 드라이버가 설치된 경우에만 지원됩니다.

AF_BTH
32
Bluetooth 주소 패밀리입니다.

컴퓨터에 Bluetooth 어댑터와 드라이버가 설치된 경우 이 주소 패밀리는 WINDOWS XP SP2 이상에서 지원됩니다.

[in] type

새 소켓의 형식 사양입니다.

소켓 형식에 사용할 수 있는 값은 Winsock2.h 헤더 파일에 정의되어 있습니다.

다음 표에서는 Windows 소켓 2에 지원되는 형식 매개 변수에 대해 가능한 값을 나열합니다.

Type 의미
SOCK_STREAM
1
OOB 데이터 전송 메커니즘을 사용하여 시퀀스된 신뢰할 수 있는 양방향 연결 기반 바이트 스트림을 제공하는 소켓 형식입니다. 이 소켓 유형은 인터넷 주소 패밀리(AF_INET 또는 AF_INET6)에 TCP(Transmission Control Protocol)를 사용합니다.
SOCK_DGRAM
2
고정된(일반적으로 작은) 최대 길이의 연결이 없고 신뢰할 수 없는 버퍼인 데이터그램을 지원하는 소켓 형식입니다. 이 소켓 유형은 인터넷 주소 패밀리(AF_INET 또는 AF_INET6)에 UDP(사용자 데이터그램 프로토콜)를 사용합니다.
SOCK_RAW
3
애플리케이션이 다음 상위 계층 프로토콜 헤더를 조작할 수 있도록 하는 원시 소켓을 제공하는 소켓 유형입니다. IPv4 헤더를 조작하려면 소켓에서 IP_HDRINCL 소켓 옵션을 설정해야 합니다. IPv6 헤더를 조작하려면 소켓에서 IPV6_HDRINCL 소켓 옵션을 설정해야 합니다.
SOCK_RDM
4
신뢰할 수 있는 메시지 데이터그램을 제공하는 소켓 유형입니다. 이 유형의 예로는 Windows에서 신뢰할 수 있는 멀티캐스트 프로그래밍이라고도 하는 실용적인 PGM(일반 멀티캐스트) 멀티캐스트 프로토콜 구현이 있습니다.

형식 값은 신뢰할 수 있는 멀티캐스트 프로토콜이 설치된 경우에만 지원됩니다.

SOCK_SEQPACKET
5
데이터그램을 기반으로 의사 스트림 패킷을 제공하는 소켓 유형입니다.
 

Windows 소켓 2에서는 새 소켓 유형이 도입되었습니다. 애플리케이션은 WSAEnumProtocols 함수를 통해 사용 가능한 각 전송 프로토콜의 특성을 동적으로 검색할 수 있습니다. 따라서 애플리케이션은 주소 패밀리에 대해 가능한 소켓 유형 및 프로토콜 옵션을 결정하고 이 매개 변수를 지정할 때 이 정보를 사용할 수 있습니다. Winsock2.h 및Ws2def.h 헤더 파일의 소켓 형식 정의는 새 소켓 형식, 주소 패밀리 및 프로토콜이 정의될 때 주기적으로 업데이트됩니다.

Windows 소켓 1.1에서 가능한 유일한 소켓 유형은 SOCK_DGRAMSOCK_STREAM.

[in] protocol

사용할 프로토콜입니다. 프로토콜 매개 변수에 사용할 수 있는 옵션은 지정된 주소 패밀리 및 소켓 유형에 따라 다릅니다. 프로토콜에 대한 가능한 값은 Winsock2.hWsrm.h 헤더 파일에 정의되어 있습니다.

Windows Vista 이상용으로 릴리스된 Windows SDK 헤더 파일의 organization 변경되었으며 이 매개 변수는 Ws2def.h 헤더 파일에 정의된 IPPROTO 열거형 형식의 값 중 하나일 수 있습니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.

값이 0인 경우 호출자는 프로토콜을 지정하지 않으며 서비스 공급자는 사용할 프로토콜 을 선택합니다.

af 매개 변수가 AF_INET 또는 AF_INET6 형식SOCK_RAW 경우 프로토콜에 지정된 값은 IPv6 또는 IPv4 패킷 헤더의 프로토콜 필드에 설정됩니다.

아래 표에는 프로토콜에 대한 일반적인 값이 나와 있지만 다른 많은 값이 가능합니다.

protocol 의미
IPPROTO_ICMP
1
ICMP(인터넷 제어 메시지 프로토콜)입니다. af 매개 변수가 AF_UNSPEC, AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_RAW 또는 지정되지 않은 경우 가능한 값입니다.

프로토콜 값은 Windows XP 이상에서 지원됩니다.

IPPROTO_IGMP
2
IGMP(인터넷 그룹 관리 프로토콜)입니다. af 매개 변수가 AF_UNSPEC, AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_RAW 또는 지정되지 않은 경우 가능한 값입니다.

프로토콜 값은 Windows XP 이상에서 지원됩니다.

BTHPROTO_RFCOMM
3
Bluetooth RFCOMM(Bluetooth 무선 주파수 통신) 프로토콜. af 매개 변수가 AF_BTH형식 매개 변수가 SOCK_STREAM 경우 가능한 값입니다.

프로토콜 값은 WINDOWS XP SP2 이상에서 지원됩니다.

IPPROTO_TCP
6
TCP(Transmission Control Protocol). af 매개 변수가 AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_STREAM 경우 가능한 값입니다.
IPPROTO_UDP
17
UDP(사용자 데이터그램 프로토콜)입니다. af 매개 변수가 AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_DGRAM 경우 가능한 값입니다.
IPPROTO_ICMPV6
58
ICMPv6(인터넷 제어 메시지 프로토콜 버전 6). af 매개 변수가 AF_UNSPEC, AF_INET 또는 AF_INET6형식 매개 변수가 SOCK_RAW 또는 지정되지 않은 경우 가능한 값입니다.

프로토콜 값은 Windows XP 이상에서 지원됩니다.

IPPROTO_RM
113
신뢰할 수 있는 멀티캐스트용 PGM 프로토콜입니다. af 매개 변수가 AF_INET형식 매개 변수가 SOCK_RDM 경우 가능한 값입니다. Windows Vista 이상용으로 릴리스된 Windows SDK 이 프로토콜을 IPPROTO_PGM라고도 합니다.

프로토콜 값은 신뢰할 수 있는 멀티캐스트 프로토콜이 설치된 경우에만 지원됩니다.

[in] lpProtocolInfo

만들 소켓의 특성을 정의하는 WSAPROTOCOL_INFO 구조체에 대한 포인터입니다. 이 매개 변수가 NULL이 아닌 경우 소켓은 표시된 WSAPROTOCOL_INFO 구조와 연결된 공급자에 바인딩됩니다.

[in] g

기존 소켓 그룹 ID 또는 새 소켓 및 새 소켓 그룹을 만들 때 수행할 적절한 작업입니다.

g가 기존 소켓 그룹 ID인 경우 이 그룹에서 설정한 모든 요구 사항이 충족되면 새 소켓을 이 소켓 그룹에 조인합니다.

g가 기존 소켓 그룹 ID가 아닌 경우 다음 값이 가능합니다.

g 의미
0
그룹 작업이 수행되지 않습니다.
SG_UNCONSTRAINED_GROUP
0x01
제한되지 않은 소켓 그룹을 만들고 새 소켓을 첫 번째 멤버로 만듭니다. 제한되지 않은 그룹의 경우 Winsock은 소켓 그룹의 모든 소켓이 형식프로토콜 매개 변수에 대해 동일한 값으로 생성되도록 제한하지 않습니다.
SG_CONSTRAINED_GROUP
0x02
제한된 소켓 그룹을 만들고 새 소켓을 첫 번째 멤버로 만듭니다. 제한된 소켓 그룹의 경우 Winsock은 소켓 그룹의 모든 소켓을 형식프로토콜 매개 변수에 대해 동일한 값으로 만들도록 제한합니다. 제한된 소켓 그룹은 연결 지향 소켓으로만 구성될 수 있으며 그룹화된 모든 소켓의 연결이 동일한 호스트의 동일한 주소에 있어야 합니다.
 
참고 SG_UNCONSTRAINED_GROUP 및 SG_CONSTRAINED_GROUP 상수는 현재 공용 헤더 파일에 정의되어 있지 않습니다.
 

[in] dwFlags

추가 소켓 특성을 지정하는 데 사용되는 플래그 집합입니다.

일부 조합은 허용되지 않지만 이러한 플래그의 조합을 설정할 수 있습니다.

의미
WSA_FLAG_OVERLAPPED
0x01
겹치는 I/O 작업을 지원하는 소켓을 만듭니다.

이 플래그 집합을 사용하여 대부분의 소켓을 만들어야 합니다. 겹치는 소켓은 겹치는 I/O 작업에 WSASend, WSASendTo, WSARecv, WSARecvFromWSAIoctl 을 활용하여 여러 작업을 동시에 시작하고 진행할 수 있습니다.

겹치는 작업(WSASend, WSARecv, WSASendTo, WSARecvFrom, WSAIoctl)을 허용하는 모든 함수는 겹치는 작업과 관련된 매개 변수 값이 NULL인 경우 겹치는 소켓에서 오버랩되지 않은 사용을 지원합니다.

WSA_FLAG_MULTIPOINT_C_ROOT
0x02
다중 포인트 세션에서 c_root 소켓을 만듭니다.

이 특성은 소켓을 만드는 전송 공급자에 대한 WSAPROTOCOL_INFO 구조가 멀티포인트 또는 멀티캐스트 메커니즘을 지원하고 다중 포인트 세션에 대한 컨트롤 플레인을 루팅하는 경우에만 허용됩니다. XP1_SUPPORT_MULTIPOINT XP1_MULTIPOINT_CONTROL_PLANE 플래그가 설정된 WSAPROTOCOL_INFO 구조체의 dwServiceFlags1 멤버로 표시됩니다.

lpProtocolInfo 매개 변수가 NULL이 아닌 경우 전송 공급자에 대한 WSAPROTOCOL_INFO 구조는 lpProtocolInfo 매개 변수로 가리킨다. lpProtocolInfo 매개 변수가 NULL이면 WSAPROTOCOL_INFO 구조는 af, type프로토콜 매개 변수에 지정된 값으로 선택한 전송 공급자를 기반으로 합니다.

멀티포인트 세션에 대한 추가 정보는 멀티포인트 및 멀티캐스트 의미 체계 를 참조하세요.

WSA_FLAG_MULTIPOINT_C_LEAF
0x04
다중 포인트 세션에서 c_leaf 소켓을 만듭니다.

이 특성은 소켓을 만드는 전송 공급자의 WSAPROTOCOL_INFO 구조가 멀티포인트 또는 멀티캐스트 메커니즘을 지원하고 다중 포인트 세션에 대한 컨트롤 플레인이 루트가 아닌 경우에만 허용됩니다. 이는 XP1_SUPPORT_MULTIPOINT 플래그가 설정되고 XP1_MULTIPOINT_CONTROL_PLANE 플래그가 설정되지 않은 WSAPROTOCOL_INFO 구조체의 dwServiceFlags1 멤버로 표시됩니다.

lpProtocolInfo 매개 변수가 NULL이 아닌 경우 전송 공급자에 대한 WSAPROTOCOL_INFO 구조는 lpProtocolInfo 매개 변수로 가리킨다. lpProtocolInfo 매개 변수가 NULL이면 WSAPROTOCOL_INFO 구조는 af, type프로토콜 매개 변수에 지정된 값으로 선택한 전송 공급자를 기반으로 합니다.

멀티포인트 세션에 대한 추가 정보는 멀티포인트 및 멀티캐스트 의미 체계 를 참조하세요.

WSA_FLAG_MULTIPOINT_D_ROOT
0x08
다중 포인트 세션에서 d_root 소켓을 만듭니다.

이 특성은 소켓을 만드는 전송 공급자의 WSAPROTOCOL_INFO 구조가 멀티포인트 또는 멀티캐스트 메커니즘을 지원하고 다중 포인트 세션에 대한 데이터 평면이 루팅된 경우에만 허용됩니다. 이는 XP1_SUPPORT_MULTIPOINT XP1_MULTIPOINT_DATA_PLANE 플래그가 설정된 WSAPROTOCOL_INFO 구조체의 dwServiceFlags1 멤버로 표시됩니다.

lpProtocolInfo 매개 변수가 NULL이 아닌 경우 전송 공급자에 대한 WSAPROTOCOL_INFO 구조는 lpProtocolInfo 매개 변수로 가리킨다. lpProtocolInfo 매개 변수가 NULL이면 WSAPROTOCOL_INFO 구조는 af, type프로토콜 매개 변수에 지정된 값으로 선택한 전송 공급자를 기반으로 합니다.

멀티포인트 세션에 대한 추가 정보는 멀티포인트 및 멀티캐스트 의미 체계 를 참조하세요.

WSA_FLAG_MULTIPOINT_D_LEAF
0x10
다중 포인트 세션에서 d_leaf 소켓을 만듭니다.

이 특성은 소켓을 만드는 전송 공급자의 WSAPROTOCOL_INFO 구조가 멀티포인트 또는 멀티캐스트 메커니즘을 지원하고 다중 포인트 세션의 데이터 평면이 루트가 아닌 경우에만 허용됩니다. XP1_SUPPORT_MULTIPOINT 플래그가 설정되고 XP1_MULTIPOINT_DATA_PLANE 플래그가 설정되지 않은 WSAPROTOCOL_INFO 구조체의 dwServiceFlags1 멤버로 표시됩니다.

lpProtocolInfo 매개 변수가 NULL이 아닌 경우 전송 공급자에 대한 WSAPROTOCOL_INFO 구조는 lpProtocolInfo 매개 변수로 가리킨다. lpProtocolInfo 매개 변수가 NULL이면 WSAPROTOCOL_INFO 구조는 af, type프로토콜 매개 변수에 지정된 값으로 선택한 전송 공급자를 기반으로 합니다.

멀티포인트 세션에 대한 추가 정보는 멀티포인트 및 멀티캐스트 의미 체계 를 참조하세요.

WSA_FLAG_ACCESS_SYSTEM_SECURITY
0x40
DACL(임의 액세스 제어 목록)이 아닌 SACL(보안 액세스 제어 목록)이 포함된 소켓에서 보안 설명자를 설정할 수 있는 소켓을 만듭니다.

SACL은 개체에서 액세스 검사 발생할 때 감사 및 경보를 생성하는 데 사용됩니다. 소켓의 경우 바인딩 함수에 지정된 특정 주소에 소켓을 바인딩할 수 있는지 여부를 결정하는 액세스 검사 발생합니다.

ACCESS_SYSTEM_SECURITY 액세스 권한은 개체의 보안 설명자에서 SACL을 얻거나 설정하는 기능을 제어합니다. 시스템은 요청 스레드의 액세스 토큰에서 SE_SECURITY_NAME 권한이 활성화된 경우에만 이 액세스 권한을 부여합니다.

WSA_FLAG_NO_HANDLE_INHERIT
0x80
상속할 수 없는 소켓을 만듭니다.

WSASocket 또는 소켓 함수에서 만든 소켓 핸들은 기본적으로 상속할 수 있습니다. 이 플래그가 설정되면 소켓 핸들은 상속할 수 없습니다.

GetHandleInformation 함수를 사용하여 WSA_FLAG_NO_HANDLE_INHERIT 플래그 집합을 사용하여 소켓 핸들이 만들어졌는지 확인할 수 있습니다. GetHandleInformation 함수는 HANDLE_FLAG_INHERIT 값이 설정된 것을 반환합니다.

이 플래그는 WINDOWS 7 SP1, Windows Server 2008 R2 SP1 이상에서 지원됩니다.

 
중요 다중 포인트 소켓의 경우 WSA_FLAG_MULTIPOINT_C_ROOT 또는 WSA_FLAG_MULTIPOINT_C_LEAF 플래그 중 하나만 지정할 수 있으며 WSA_FLAG_MULTIPOINT_D_ROOT 또는 WSA_FLAG_MULTIPOINT_D_LEAF 플래그 중 하나만 지정할 수 있습니다. 추가 정보는 멀티포인트 및 멀티캐스트 의미 체계를 참조하세요 .
 

반환 값

오류가 발생하지 않으면 WSASocket 은 새 소켓을 참조하는 설명자를 반환합니다. 그렇지 않으면 INVALID_SOCKET 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

참고 이 오류 코드 설명은 Microsoft 전용입니다.
 
오류 코드 의미
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAEAFNOSUPPORT
지정된 주소 패밀리는 지원되지 않습니다.
WSAEFAULT
lpProtocolInfo 매개 변수가 프로세스 주소 공간의 유효한 부분에 있지 않습니다.
WSAEINPROGRESS
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINVAL
이 값은 다음 조건에 대해 true입니다.
  • 지정된 g 매개 변수가 잘못되었습니다.
  • lpProtocolInfo가 가리키는 WSAPROTOCOL_INFO 구조체가 불완전하거나, 내용이 잘못되었거나, WSAPROTOCOL_INFO 구조체가 이전의 중복 소켓 작업에서 이미 사용되었습니다.
  • 소켓 삼중 <af, 형식프로토콜> 의 멤버에 대해 지정된 값은 개별적으로 지원되지만 지정된 조합은 지원되지 않습니다.
WSAEINVALIDPROVIDER
서비스 공급자는 2.2 이외의 버전을 반환했습니다.
WSAEINVALIDPROCTABLE
서비스 공급자가 잘못되었거나 불완전한 프로시저 테이블을 WSPStartup에 반환했습니다.
WSAEMFILE
더 이상 소켓 설명자를 사용할 수 없습니다.
WSAENOBUFS
사용할 수 있는 버퍼 공간이 없습니다. 소켓을 만들 수 없습니다.
WSAEPROTONOSUPPORT
지정한 프로토콜이 지원되지 않습니다.
WSAEPROTOTYPE
지정된 프로토콜이 이 소켓의 잘못된 형식입니다.
WSAEPROVIDERFAILEDINIT
서비스 공급자를 초기화하지 못했습니다. 이 오류는 계층화된 서비스 공급자(LSP) 또는 네임스페이스 공급자가 잘못 설치되었거나 공급자가 제대로 작동하지 않는 경우 반환됩니다.
WSAESOCKTNOSUPPORT
지정된 소켓 유형은 이 주소 패밀리에서 지원되지 않습니다.

설명

WSASocket 함수는 소켓 설명자 및 관련 리소스를 할당하고 전송 서비스 공급자와 연결합니다. 대부분의 소켓은 dwFlags 매개 변수에 설정된 WSA_FLAG_OVERLAPPED 특성으로 만들어야 합니다. 이 특성으로 만든 소켓은 더 높은 성능을 제공하는 겹치는 I/O 작업의 사용을 지원합니다. 기본적으로 WSASocket 함수를 사용하여 만든 소켓에는 이 겹치는 특성 집합이 없습니다. 반면 소 함수는 겹치는 I/O 작업을 기본 동작으로 지원하는 소켓을 만듭니다.

lpProtocolInfo 매개 변수가 NULL인 경우 Winsock은 af, typeprotocol 매개 변수에 지정된 주소 패밀리, 소켓 유형 및 프로토콜의 요청된 조합을 지원하는 첫 번째 사용 가능한 전송 서비스 공급자를 활용합니다.

lpProtocolInfo 매개 변수가 NULL이 아니면 소켓이 표시된 WSAPROTOCOL_INFO 구조체와 연결된 공급자에 바인딩됩니다. 이 instance 애플리케이션은 매니페스트 상수 FROM_PROTOCOL_INFOaf, type 또는 protocol 매개 변수의 값으로 제공할 수 있습니다. 이는 표시된 WSAPROTOCOL_INFO 구조체(iAddressFamily, iSocketType, iProtocol)의 해당 값을 가정해야 함을 나타냅니다. 어쨌든 af, typeprotocol 에 지정된 값은 전송 서비스 공급자에게 수정되지 않은 상태로 전달됩니다.

af, typeprotocol에 따라 프로토콜 및 지원 서비스 공급자를 선택할 때 이 절차는 프로토콜 계층 자체가 아닌 기본 프로토콜 또는 프로토콜 체인만 선택합니다. 연결되지 않은 프로토콜 계층은 형식 또는 af에 부분 일치 항목이 있는 것으로 간주되지 않습니다. 즉, 적절한 프로토콜이 없는 경우 WSAEAFNOSUPPORT 또는 WSAEPROTONOSUPPORT의 오류 코드로 이어지지 않습니다.

참고 매니페스트 상수 AF_UNSPEC 헤더 파일에서 계속 정의되지만 프로토콜 매개 변수의 값을 해석하는 데 모호성이 발생할 수 있으므로 해당 사용은 권장되지 않습니다.
 
애플리케이션은 af 매개 변수에 AF_INET6 사용하고 IPv4 및 IPv6 둘 다에서 사용할 수 있는 이중 모드 소켓을 만드는 것이 좋습니다.

WSASocket 함수를 사용하여 소켓을 만든 경우 dwFlags 매개 변수에는 SO_RCVTIMEO 또는 SO_SNDTIMEO 소켓 옵션이 제대로 작동하려면 WSA_FLAG_OVERLAPPED 특성이 설정되어 있어야 합니다. 그렇지 않으면 시간 제한이 소켓에 적용되지 않습니다.

SOCK_STREAM 같은 연결 지향 소켓은 전체 이중 연결을 제공하며 데이터를 보내거나 받기 전에 연결된 상태여야 합니다. 지정된 소켓에 대한 연결은 connect 또는 WSAConnect 함수 호출을 사용하여 설정됩니다. 연결되면WSASendrecv/WSARecv 호출을 사용하여/ 데이터를 전송할 수 있습니다. 세션이 완료되면 closesocket 함수를 호출하여 소켓과 연결된 리소스를 해제해야 합니다. 연결 지향 소켓의 경우 closesocket 함수를 호출하기 전에 소켓에서 데이터 전송을 중지하기 위해 종료 함수를 호출해야 합니다.

신뢰할 수 있는 연결 지향 소켓을 구현하는 데 사용되는 통신 프로토콜은 데이터가 손실되거나 중복되지 않도록 합니다. 피어 프로토콜에 버퍼 공간이 있는 데이터가 적절한 시간 내에 성공적으로 전송될 수 없는 경우 연결이 끊어진 것으로 간주되고 WSAETIMEDOUT으로 설정된 오류 코드로 인해 후속 호출이 실패합니다.

연결이 없는 메시지 지향 소켓을 사용하면 sendto/WSASendTowSARecvFrom에서 recvfrom/을 사용하여 임의 피어로 데이터그램을 보내고 받을 수 있습니다. 이러한 소켓이 특정 피어에 연결된 경우WSASend보내기/를 사용하여 데이터그램을 해당 피어로 보낼 수 있으며, recv/WSARecv를 사용하여 이 피어에서(만) 수신할 수 있습니다.

SOCK_RAW 형식의 소켓에 대한 지원은 필요하지 않지만 서비스 공급자는 가능하면 원시 소켓을 지원하는 것이 좋습니다.

WSASocket 함수를 사용하여 다른 소켓이 서비스에서 사용하는 동일한 포트에 바인딩을 시도하고 감사 레코드가 생성되도록 서비스에서 사용할 소켓을 만들 수 있습니다. 이 옵션을 사용하도록 설정하려면 애플리케이션에서 다음을 수행해야 합니다.

  • AdjustTokenPrivileges 함수를 호출하여 프로세스에 대한 액세스 토큰에서 SE_SECURITY_NAME 권한을 사용하도록 설정합니다. 이 권한은 개체의 보안 설명자에 대한 ACCESS_SYSTEM_SECURITY 액세스 권한을 설정하는 데 필요합니다.
  • WSASocket 함수를 호출하여 WSA_FLAG_ACCESS_SYSTEM_SECURITY 옵션이 설정된 dwFlag를 사용하여 소켓을 만듭니다. 이 작업에 필요한 SE_SECURITY_NAME 권한을 사용하도록 설정하기 위해 AdjustTokenPrivileges 함수를 먼저 호출하지 않으면 WSASocket 함수가 실패합니다.
  • SetSecurityInfo 함수를 호출하여 소켓에 SACL(시스템 Access Control 목록)을 사용하여 보안 설명자를 설정합니다. WSASocket 함수에서 반환된 소켓 핸들은 핸들 매개 변수에 전달됩니다. 함수가 성공하면 소켓의 보안 설명자에서 바로 ACCESS_SYSTEM_SECURITY 액세스 권한이 설정됩니다.
  • 바인딩 함수를 호출하여 소켓을 특정 포트에 바인딩합니다. 바인딩 함수가 성공하면 다른 소켓이 동일한 포트에 바인딩하려고 하면 감사 항목이 생성됩니다.
  • AdjustTokenPrivileges 함수를 호출하여 프로세스에 대한 액세스 토큰의 SE_SECURITY_NAME 권한을 제거합니다. 더 이상 필요하지 않으므로

ACCESS_SYSTEM_SECURITY 대한 자세한 내용은 권한 부여 설명서의 SACL 액세스 권한감사 생성을 참조하세요.

소켓 그룹

WinSock 2는 소켓 그룹의 개념을 애플리케이션 또는 애플리케이션의 협력 집합에 대한 수단으로 도입하여 기본 서비스 공급자에게 특정 소켓 집합이 관련되어 있고 따라서 형성된 그룹에 특정 특성이 있음을 나타냅니다. 그룹 특성에는 그룹 내 개별 소켓의 상대적 우선 순위와 그룹 서비스 품질 사양이 포함됩니다.

네트워크를 통해 멀티미디어 스트림을 교환해야 하는 애플리케이션은 소켓 집합 간에 특정 관계를 설정할 수 있는 것이 도움이 될 수 있는 예입니다. 소켓 그룹을 처리하는 방법은 전송에 달려 있습니다.

WSASocketWSAAccept 함수를 사용하여 새 소켓을 만들 때 소켓 그룹을 명시적으로 만들고 조인할 수 있습니다. 수준 매개 변수가 SOL_SOCKET 설정되고 optname 매개 변수가 SO_GROUP_ID 설정된 getsockopt 함수를 사용하여 소켓의 소켓 그룹 ID를 검색할 수 있습니다. 소켓 그룹 및 관련 소켓 그룹 ID는 이 소켓 그룹에 속한 마지막 소켓이 닫히기 전까지 유효한 상태로 유지됩니다. 소켓 그룹 ID는 지정된 서비스 공급자에 대한 모든 프로세스에서 고유합니다. 소켓 그룹이 0이면 소켓이 소켓 그룹의 멤버가 아님을 나타냅니다.

수준 매개 변수가 SOL_SOCKET 설정되고 optname 매개 변수가 SO_GROUP_PRIORITY 설정된 getsockopt 함수를 사용하여 소켓 그룹의 상대 그룹 우선 순위에 액세스할 수 있습니다. 켓 그룹의 상대 그룹 우선 순위는 level 매개 변수가 SOL_SOCKET 설정되고 optname 매개 변수가 SO_GROUP_PRIORITY 설정된 setsockopt를 사용하여 설정할 수 있습니다.

Windows에 포함된 Winsock 공급자는 소켓 그룹을 만들 수 있으며 SG_CONSTRAINED_GROUP 적용합니다. 제한된 소켓 그룹의 모든 소켓은 형식프로토콜 매개 변수에 대해 동일한 값으로 만들어야 합니다. 제한된 소켓 그룹은 연결 지향 소켓으로만 구성될 수 있으며, 그룹화된 모든 소켓의 연결이 동일한 호스트의 동일한 주소에 있어야 합니다. 이는 Windows에 포함된 Winsock 공급자가 소켓 그룹에 적용되는 유일한 제한 사항입니다. 소켓 그룹 우선 순위는 현재 Winsock 공급자 또는 Windows에 포함된 TCP/IP 스택에서 사용되지 않습니다.

예제 코드

다음 예제에서는 WSASocket 함수를 사용하는 방법을 보여 줍니다.
#ifndef UNICODE
#define UNICODE 1
#endif

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

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi


int __cdecl wmain(int argc, wchar_t **argv)
{

    //-----------------------------------------
    // Declare and initialize variables
    WSADATA wsaData = {0};
    int iResult = 0;

//    int i = 1;

    SOCKET sock = INVALID_SOCKET;
    int iFamily = AF_UNSPEC;
    int iType = 0;
    int iProtocol = 0;
    DWORD dwFlags = 0;

    // Validate the parameters
    if (argc != 5) {
        wprintf(L"usage: %s <addressfamily> <type> <protocol> <flags>\n", argv[0]);
        wprintf(L"       opens a socket for the specified family, type, protocol, and flags\n");
        wprintf(L"       flags value must be in decimal, not hex\n");
        wprintf(L"%ws example usage\n", argv[0]);
        wprintf(L"   %ws 0 2 17 1\n", argv[0]);
        wprintf(L"   where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17 OVERLAPPED\n", argv[0]);
        return 1;
    }

    iFamily = _wtoi(argv[1]);
    iType = _wtoi(argv[2]);
    iProtocol = _wtoi(argv[3]);
    dwFlags = _wtoi(argv[4]);
    
    // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        wprintf(L"WSAStartup failed: %d\n", iResult);
        return 1;
    }

    wprintf(L"Calling socket with following parameters:\n");
    wprintf(L"  Address Family = ");
    switch (iFamily) {
    case AF_UNSPEC:
        wprintf(L"Unspecified");
        break;
    case AF_INET:
        wprintf(L"AF_INET (IPv4)");
        break;
    case AF_INET6:
        wprintf(L"AF_INET6 (IPv6)");
        break;
    case AF_NETBIOS:
        wprintf(L"AF_NETBIOS (NetBIOS)");
        break;
    case AF_BTH:
        wprintf(L"AF_BTH (Bluetooth)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iFamily);
    
    wprintf(L"  Socket type = ");
    switch (iType) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case SOCK_STREAM:
        wprintf(L"SOCK_STREAM (stream)");
        break;
    case SOCK_DGRAM:
        wprintf(L"SOCK_DGRAM (datagram)");
        break;
    case SOCK_RAW:
        wprintf(L"SOCK_RAW (raw)");
        break;
    case SOCK_RDM:
        wprintf(L"SOCK_RDM (reliable message datagram)");
        break;
    case SOCK_SEQPACKET:
        wprintf(L"SOCK_SEQPACKET (pseudo-stream packet)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iType);

    wprintf(L"  Protocol = %d = ", iProtocol);
    switch (iProtocol) {
    case 0:
        wprintf(L"Unspecified");
        break;
    case IPPROTO_ICMP:
        wprintf(L"IPPROTO_ICMP (ICMP)");
        break;
    case IPPROTO_IGMP:
        wprintf(L"IPPROTO_IGMP (IGMP)");
        break;
    case IPPROTO_TCP:
        wprintf(L"IPPROTO_TCP (TCP)");
        break;
    case IPPROTO_UDP:
        wprintf(L"IPPROTO_UDP (UDP)");
        break;
    case IPPROTO_ICMPV6:
        wprintf(L"IPPROTO_ICMPV6 (ICMP Version 6)");
        break;
    default:
        wprintf(L"Other");
        break;
    }
    wprintf(L" (%d)\n", iProtocol);

    wprintf(L"  Flags = ");
    if (dwFlags & WSA_FLAG_OVERLAPPED)
        wprintf(L"  WSA_FLAG_OVERLAPPED");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_C_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_C_LEAF");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_ROOT)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_ROOT");
    if (dwFlags & WSA_FLAG_MULTIPOINT_D_LEAF)
        wprintf(L"  WSA_FLAG_MULTIPOINT_D_LEAF");
    if (dwFlags & WSA_FLAG_ACCESS_SYSTEM_SECURITY)
        wprintf(L"  WSA_FLAG_ACCESS_SYSTEM_SECURITY");
#ifdef WSA_FLAG_NO_HANDLE_INHERIT 
    if (dwFlags & WSA_FLAG_NO_HANDLE_INHERIT)
        wprintf(L"  WSA_FLAG_NO_HANDLE_INHERIT");
#endif
    wprintf(L" (0x%x)\n" , dwFlags);

    sock = WSASocket(iFamily, iType, iProtocol, NULL, 0, dwFlags);
    if (sock == INVALID_SOCKET) 
        wprintf(L"WSASocket function failed with error = %d\n", WSAGetLastError() );
    else {
        wprintf(L"WSASocket function succeeded\n");

        // Close the socket to release the resources associated
        // Normally an application calls shutdown() before closesocket 
        //   to  disables sends or receives on a socket first
        // This isn't needed in this simple sample
        iResult = closesocket(sock);
        if (iResult == SOCKET_ERROR) {
            wprintf(L"closesocket function zfailed with error = %d\n", WSAGetLastError() );
            WSACleanup();
            return 1;
        }    
    }
    WSACleanup();

    return 0;
}


Windows Phone 8:WSASocketW 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에 대해 지원됩니다.

Windows 8.1Windows Server 2012 R2: WSASocketW 함수는 Windows 8.1, Windows Server 2012 R2 이상의 Windows 스토어 앱에서 지원됩니다.

참고

winsock2.h 헤더는 유니코드 전처리기 상수의 정의에 따라 이 함수의 ANSI 또는 유니코드 버전을 자동으로 선택하는 별칭으로 WSASocket을 정의합니다. 인코딩 중립 별칭을 인코딩 중립이 아닌 코드와 혼합하면 컴파일 또는 런타임 오류가 발생하는 불일치가 발생할 수 있습니다. 자세한 내용은 함수 프로토타입에 대한 규칙을 참조하세요.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱]
지원되는 최소 서버 Windows Server 2003 [데스크톱 앱 | UWP 앱]
대상 플랫폼 Windows
헤더 winsock2.h
라이브러리 Ws2_32.lib
DLL Ws2_32.dll

추가 정보

WSAPROTOCOL_INFO

Winsock 함수

Winsock 참조

받아들일

bind

closesocket

connect

getsockname

getsockopt

ioctlsocket

listen

Recv

recvfrom

선택

send

Sendto

setsockopt

shutdown

socket