초기화 후 SOCKET 개체를 서버에서 사용하기 위해 인스턴스화해야 합니다.
서버 대한 소켓을 만들려면
getaddrinfo 함수는 sockaddr 구조체의 값을 확인하는 데 사용됩니다.
- AF_INET IPv4 주소 패밀리를 지정하는 데 사용됩니다.
- SOCK_STREAM 스트림 소켓을 지정하는 데 사용됩니다.
- IPPROTO_TCP TCP 프로토콜을 지정하는 데 사용됩니다.
- AI_PASSIVE 플래그는 호출자가 바인딩 함수에 대한 호출에서 반환된 소켓 주소 구조를 사용하려고 했음을 나타냅니다. AI_PASSIVE 플래그를 설정하고 getaddrinfo 함수에 노드 이름 매개 변수를NULL 포인터인 경우 소켓 주소 구조의 IP 주소 부분은 IPv4 주소 또는 IPv6 주소의 IN6ADDR_ANY_INITINADDR_ANY 설정됩니다.
- 27015는 클라이언트가 연결할 서버와 연결된 포트 번호입니다.
addrinfo 구조체는 getaddrinfo 함수에서 사용됩니다.
#define DEFAULT_PORT "27015" struct addrinfo *result = NULL, *ptr = NULL, hints; ZeroMemory(&hints, sizeof (hints)); hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; hints.ai_flags = AI_PASSIVE; // Resolve the local address and port to be used by the server iResult = getaddrinfo(NULL, DEFAULT_PORT, &hints, &result); if (iResult != 0) { printf("getaddrinfo failed: %d\n", iResult); WSACleanup(); return 1; }서버가 클라이언트 연결을 수신 대기할 수 있도록 ListenSocket이라는 SOCKET 개체를 만듭니다.
SOCKET ListenSocket = INVALID_SOCKET;소켓 함수를 호출하고 해당 값을 ListenSocket 변수로 반환합니다. 이 서버 애플리케이션의 경우 힌트 매개 변수에 지정된 주소 패밀리, 소켓 유형 및 프로토콜과 일치하는 getaddrinfo호출에서 반환된 첫 번째 IP 주소를 사용합니다. 이 예제에서는 IPv4의 주소 패밀리, SOCK_STREAM 소켓 유형 및 IPPROTO_TCP 프로토콜을 사용하여 IPv4용 TCP 스트림 소켓을 요청했습니다. 따라서 ListenSocket에 대해 IPv4 주소가 요청됩니다.
서버 애플리케이션이 IPv6에서 수신 대기하려는 경우 힌트 매개 변수에서 주소 패밀리를 AF_INET6 설정해야 합니다. 서버가 IPv6 및 IPv4 모두에서 수신 대기하려는 경우 두 개의 수신 대기 소켓(IPv6용 및 IPv4용)을 만들어야 합니다. 이러한 두 소켓은 애플리케이션에서 별도로 처리해야 합니다.
Windows Vista 이상에서는 IPv6 및 IPv4 모두에서 수신 대기하는 이중 스택 모드로 제공되는 단일 IPv6 소켓을 만드는 기능을 제공합니다. 이 기능에 대한 자세한 내용은 Dual-Stack 소켓참조하세요.
// Create a SOCKET for the server to listen for client connections ListenSocket = socket(result->ai_family, result->ai_socktype, result->ai_protocol);소켓이 유효한지 확인하기 위해 오류를 점검합니다.
if (ListenSocket == INVALID_SOCKET) { printf("Error at socket(): %ld\n", WSAGetLastError()); freeaddrinfo(result); WSACleanup(); return 1; }
다음 단계: 소켓 바인딩
관련 항목