서버에 대한 소켓 만들기
초기화 후 서버에서 사용할 SOCKET 개체를 인스턴스화해야 합니다.
서버에 대한 소켓을 만들려면
getaddrinfo 함수는 sockaddr 구조체의 값을 확인하는 데 사용됩니다.
- AF_INET IPv4 주소 패밀리를 지정하는 데 사용됩니다.
- SOCK_STREAM 스트림 소켓을 지정하는 데 사용됩니다.
- IPPROTO_TCP TCP 프로토콜 을 지정하는 데 사용됩니다.
- AI_PASSIVE 플래그는 호출자가 바인딩 함수 호출에서 반환된 소켓 주소 구조를 사용하려고 했음을 나타냅니다. AI_PASSIVE 플래그가 설정되고 getaddrinfo 함수에 대한 nodename 매개 변수가 NULL 포인터인 경우 소켓 주소 구조의 IP 주소 부분은 IPv4 주소 또는 IPv6 주소에 대한 IN6ADDR_ANY_INIT INADDR_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 변수로 반환합니다. 이 서버 애플리케이션의 경우 호출에서 반환된 첫 번째 IP 주소를 사용하여 hints 매개 변수에 지정된 주소 패밀리, 소켓 유형 및 프로토콜과 일치하는 getaddrinfo를 가져옵니다. 이 예제에서는 IPv4의 주소 패밀리, 소켓 유형의 SOCK_STREAM 및 IPPROTO_TCP 프로토콜을 사용하여 IPv4용 TCP 스트림 소켓을 요청했습니다. 따라서 ListenSocket에 대한 IPv4 주소가 요청됩니다.
서버 애플리케이션이 IPv6에서 수신 대기하려는 경우 주소 패밀리를 hints 매개 변수의 AF_INET6 설정해야 합니다. 서버가 IPv6 및 IPv4 모두에서 수신 대기하려는 경우 두 개의 수신 대기 소켓(IPv6용 및 IPv4용)을 만들어야 합니다. 이러한 두 소켓은 애플리케이션에서 별도로 처리해야 합니다.
Windows Vista 이상에서는 IPv6 및 IPv4 모두에서 수신 대기하도록 이중 스택 모드로 제공되는 단일 IPv6 소켓을 만드는 기능을 제공합니다. 이 기능에 대한 자세한 내용은 이중 스택 소켓을 참조하세요.
// 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; }
다음 단계: 소켓 바인딩
관련 항목