socket 함수(winsock2.h)
소켓 함수는 특정 전송 서비스 공급자에 바인딩된 소켓을 만듭니다.
구문
SOCKET WSAAPI socket(
[in] int af,
[in] int type,
[in] int protocol
);
매개 변수
[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_INET 및 PF_INET) 두 상수를 모두 사용할 수 있습니다.
아래 표에는 주소 패밀리에 대한 공통 값이 나와 있지만 다른 많은 값이 가능합니다.
Af | 의미 |
---|---|
|
주소 패밀리는 지정되지 않습니다. |
|
IPv4(인터넷 프로토콜 버전 4) 주소 패밀리입니다. |
|
IPX/SPX 주소 패밀리입니다. 이 주소 패밀리는 NWLink IPX/SPX NetBIOS 호환 전송 프로토콜이 설치된 경우에만 지원됩니다.
이 주소 패밀리는 Windows Vista 이상에서 지원되지 않습니다. |
|
AppleTalk 주소 패밀리입니다. 이 주소 패밀리는 AppleTalk 프로토콜이 설치된 경우에만 지원됩니다.
이 주소 패밀리는 Windows Vista 이상에서 지원되지 않습니다. |
|
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 이상에서 지원되지 않습니다. |
|
IPv6(인터넷 프로토콜 버전 6) 주소 패밀리입니다. |
|
IrDA(적외선 데이터 연결) 주소 패밀리입니다.
이 주소 패밀리는 컴퓨터에 적외선 포트와 드라이버가 설치된 경우에만 지원됩니다. |
|
Bluetooth 주소 패밀리입니다.
컴퓨터에 Bluetooth 어댑터와 드라이버가 설치된 경우 이 주소 패밀리는 WINDOWS XP SP2 이상에서 지원됩니다. |
[in] type
새 소켓의 형식 사양입니다.
소켓 형식에 사용할 수 있는 값은 Winsock2.h 헤더 파일에 정의되어 있습니다.
다음 표에서는 Windows 소켓 2에 지원되는 형식 매개 변수에 대해 가능한 값을 나열합니다.
Type | 의미 |
---|---|
|
OOB 데이터 전송 메커니즘을 사용하여 시퀀스된 신뢰할 수 있는 양방향 연결 기반 바이트 스트림을 제공하는 소켓 형식입니다. 이 소켓 유형은 인터넷 주소 패밀리(AF_INET 또는 AF_INET6)에 TCP(Transmission Control Protocol)를 사용합니다. |
|
고정된(일반적으로 작은) 최대 길이의 연결이 없고 신뢰할 수 없는 버퍼인 데이터그램을 지원하는 소켓 형식입니다. 이 소켓 유형은 인터넷 주소 패밀리(AF_INET 또는 AF_INET6)에 UDP(사용자 데이터그램 프로토콜)를 사용합니다. |
|
애플리케이션이 다음 상위 계층 프로토콜 헤더를 조작할 수 있도록 하는 원시 소켓을 제공하는 소켓 유형입니다. IPv4 헤더를 조작하려면 소켓에서 IP_HDRINCL 소켓 옵션을 설정해야 합니다. IPv6 헤더를 조작하려면 소켓에서 IPV6_HDRINCL 소켓 옵션을 설정해야 합니다. |
|
신뢰할 수 있는 메시지 데이터그램을 제공하는 소켓 유형입니다. 이 유형의 예로는 Windows에서 신뢰할 수 있는 멀티캐스트 프로그래밍이라고도 하는 실용적인 PGM(일반 멀티캐스트) 멀티캐스트 프로토콜 구현이 있습니다.
이 형식 값은 신뢰할 수 있는 멀티캐스트 프로토콜이 설치된 경우에만 지원됩니다. |
|
데이터그램을 기반으로 의사 스트림 패킷을 제공하는 소켓 유형입니다. |
Windows 소켓 2에서는 새 소켓 유형이 도입되었습니다. 애플리케이션은 WSAEnumProtocols 함수를 통해 사용 가능한 각 전송 프로토콜의 특성을 동적으로 검색할 수 있습니다. 따라서 애플리케이션은 주소 패밀리에 대해 가능한 소켓 유형 및 프로토콜 옵션을 결정하고 이 매개 변수를 지정할 때 이 정보를 사용할 수 있습니다. Winsock2.h 및Ws2def.h 헤더 파일의 소켓 형식 정의는 새 소켓 형식, 주소 패밀리 및 프로토콜이 정의될 때 주기적으로 업데이트됩니다.
Windows 소켓 1.1에서 가능한 유일한 소켓 유형은 SOCK_DGRAM 및 SOCK_STREAM.
[in] protocol
사용할 프로토콜입니다. 프로토콜 매개 변수에 사용할 수 있는 옵션은 지정된 주소 패밀리 및 소켓 유형에 따라 다릅니다. 프로토콜에 사용할 수 있는 값은 Winsock2.h 및 Wsrm.h 헤더 파일에 정의됩니다.
Windows Vista 이상용으로 릴리스된 Windows SDK 헤더 파일의 organization 변경되었으며 이 매개 변수는 Ws2def.h 헤더 파일에 정의된 IPPROTO 열거형 형식의 값 중 하나일 수 있습니다. Ws2def.h 헤더 파일은 Winsock2.h에 자동으로 포함되며 직접 사용하면 안 됩니다.
값이 0인 경우 호출자는 프로토콜을 지정하지 않으며 서비스 공급자는 사용할 프로토콜 을 선택합니다.
af 매개 변수가 AF_INET 또는 AF_INET6 형식이 SOCK_RAW 경우 프로토콜에 지정된 값은 IPv6 또는 IPv4 패킷 헤더의 프로토콜 필드에 설정됩니다.
아래 표에는 프로토콜에 대한 일반적인 값이 나와 있지만 다른 많은 값이 가능합니다.
반환 값
오류가 발생하지 않으면 소켓은 새 소켓 을 참조하는 설명자를 반환합니다. 그렇지 않으면 INVALID_SOCKET 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.
오류 코드 | 의미 |
---|---|
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. | |
네트워크 하위 시스템 또는 연결된 서비스 공급자가 실패했습니다. | |
지정된 주소 패밀리는 지원되지 않습니다. 예를 들어 애플리케이션이 AF_IRDA 주소 패밀리에 대한 소켓을 만들려고 했지만 적외선 어댑터 및 디바이스 드라이버가 로컬 컴퓨터에 설치되지 않았습니다. | |
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다. | |
더 이상 소켓 설명자를 사용할 수 없습니다. | |
잘못된 인수가 지정되었습니다. af 매개 변수가 AF_UNSPEC 설정되고 형식 및 프로토콜 매개 변수가 지정되지 않은 경우 이 오류가 반환됩니다. | |
서비스 공급자는 2.2 이외의 버전을 반환했습니다. | |
서비스 공급자가 잘못되었거나 불완전한 프로시저 테이블을 WSPStartup에 반환했습니다. | |
사용할 수 있는 버퍼 공간이 없습니다. 소켓을 만들 수 없습니다. | |
지정한 프로토콜이 지원되지 않습니다. | |
지정된 프로토콜이 이 소켓의 잘못된 형식입니다. | |
서비스 공급자를 초기화하지 못했습니다. 이 오류는 LSP(계층화된 서비스 공급자) 또는 네임스페이스 공급자가 잘못 설치되었거나 공급자가 제대로 작동하지 않는 경우 반환됩니다. | |
지정된 소켓 유형은 이 주소 패밀리에서 지원되지 않습니다. |
설명
소켓 함수는 소켓 설명자 및 관련 리소스를 할당하고 특정 전송 서비스 공급자에 바인딩합니다. Winsock은 주소 패밀리, 소켓 유형 및 프로토콜 매개 변수의 요청된 조합을 지원하는 사용 가능한 첫 번째 서비스 공급자를 활용합니다. 만들어진 소켓에는 겹치는 특성이 기본값으로 있습니다. Windows의 경우 Mswsock.h에 정의된 Microsoft 관련 소켓 옵션인 SO_OPENTYPE 이 기본값에 영향을 줄 수 있습니다. SO_OPENTYPE 대한 자세한 설명은 Microsoft 관련 설명서를 참조하세요.
겹치는 특성이 없는 소켓은 WSASocket을 사용하여 만들 수 있습니다. 겹치는 작업(WSASend, WSARecv, WSASendTo, WSARecvFrom 및 WSAIoctl)을 허용하는 모든 함수는 겹치는 작업과 관련된 매개 변수 값이 NULL인 경우 겹치는 소켓에서 오버레이되지 않은 사용도 지원합니다.
프로토콜 및 지원 서비스 공급자를 선택할 때 이 절차는 프로토콜 계층 자체가 아닌 기본 프로토콜 또는 프로토콜 체인만 선택합니다. 연결되지 않은 프로토콜 계층은 형식 또는 af 에 부분 일치 항목이 있는 것으로 간주되지 않습니다. 즉, 적절한 프로토콜이 없는 경우 WSAEAFNOSUPPORT 또는 WSAEPROTONOSUPPORT 의 오류 코드로 이어지지 않습니다.
SOCK_STREAM 같은 연결 지향 소켓은 전체 이중 연결을 제공하며 데이터가 전송되거나 수신되기 전에 연결된 상태여야 합니다. 연결 호출을 사용하여 다른 소켓에 대한 연결 이 만들어집니다. 연결되면 송신 및 사각형 호출을 사용하여 데이터를 전송할 수 있습니다. 세션이 완료되면 closesocket을 수행해야 합니다.
신뢰할 수 있는 연결 지향 소켓을 구현하는 데 사용되는 통신 프로토콜은 데이터가 손실되거나 중복되지 않도록 합니다. 피어 프로토콜에 버퍼 공간이 있는 데이터를 적절한 시간 내에 성공적으로 전송할 수 없는 경우 연결이 끊어진 것으로 간주되고 오류 코드가 WSAETIMEDOUT으로 설정되면 후속 호출이 실패합니다.
연결이 없는 메시지 지향 소켓을 사용하면 sendto 및 recvfrom을 사용하여 임의 피어로 데이터그램을 보내고 받을 수 있습니다. 이러한 소켓이 특정 피어에 연결된 경우 전송 을 사용하여 해당 피어로 데이터그램을 보낼 수 있으며 recv를 사용하여 이 피어에서만 수신할 수 있습니다.
IPv6 및 IPv4는 SOCK_RAW형식의 소켓을 수신할 때 다르게 작동합니다. IPv4 수신 패킷에는 패킷 페이로드, 다음 상위 수준 헤더(예: TCP 또는 UDP 패킷의 IP 헤더) 및 IPv4 패킷 헤더가 포함됩니다. IPv6 수신 패킷에는 패킷 페이로드와 다음 상위 수준 헤더가 포함됩니다. IPv6 수신 패킷에는 IPv6 패킷 헤더가 포함되어 없습니다.
af 매개 변수가 TCP/IP를 통해 NetBIOS에 AF_NETBIOS경우 형식 매개 변수를 SOCK_DGRAM 또는 SOCK_SEQPACKET 수 있습니다. AF_NETBIOS 주소 패밀리의 경우 프로토콜 매개 변수는 음수로 표현되는 LAN 어댑터 번호입니다.
Windows XP 이상에서는 다음 명령을 사용하여 Windows 소켓 카탈로그를 나열하여 설치된 서비스 공급자와 지원되는 주소 패밀리, 소켓 유형 및 프로토콜을 확인할 수 있습니다.
netsh winsock show catalog
SOCK_RAW 형식의 소켓에 대한 지원은 필요하지 않지만 서비스 공급자는 원시 소켓을 실행 가능한 방식으로 지원하는 것이 좋습니다.
IrDA 소켓에 대한 참고 사항
다음 사항을 고려하세요.- Af_irda.h 헤더 파일은 명시적으로 포함되어야 합니다.
- SOCK_STREAM만 지원됩니다. SOCK_DGRAM 형식은 IrDA에서 지원되지 않습니다.
- 프로토콜 매개 변수는 항상 IrDA에 대해 0으로 설정됩니다.
예제 코드
다음 예제에서는 소켓 함수를 사용하여 특정 전송 서비스 공급자에 바인딩된 소켓을 만드는 방법을 보여 줍니다.#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;
// Validate the parameters
if (argc != 4) {
wprintf(L"usage: %s <addressfamily> <type> <protocol>\n", argv[0]);
wprintf(L"socket opens a socket for the specified family, type, & protocol\n");
wprintf(L"%ws example usage\n", argv[0]);
wprintf(L" %ws 0 2 17\n", argv[0]);
wprintf(L" where AF_UNSPEC=0 SOCK_DGRAM=2 IPPROTO_UDP=17\n", argv[0]);
return 1;
}
iFamily = _wtoi(argv[1]);
iType = _wtoi(argv[2]);
iProtocol = _wtoi(argv[3]);
// 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);
sock = socket(iFamily, iType, iProtocol);
if (sock == INVALID_SOCKET)
wprintf(L"socket function failed with error = %d\n", WSAGetLastError() );
else {
wprintf(L"socket 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 failed with error = %d\n", WSAGetLastError() );
WSACleanup();
return 1;
}
}
WSACleanup();
return 0;
}
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 앱] |
대상 플랫폼 | Windows |
헤더 | winsock2.h |
라이브러리 | Ws2_32.lib |
DLL | Ws2_32.dll |