Share via


서버에 대한 소켓 만들기

초기화 후 서버에서 사용할 SOCKET 개체를 인스턴스화해야 합니다.

서버에 대한 소켓을 만들려면

  1. 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;
    }
    
  2. 서버가 클라이언트 연결을 수신 대기할 수 있도록 ListenSocket이라는 SOCKET 개체를 만듭니다.

    SOCKET ListenSocket = INVALID_SOCKET;
    
  3. 소켓 함수를 호출하고 해당 값을 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);
    
  4. 소켓이 유효한 소켓인지 확인하려면 오류를 확인합니다.

    if (ListenSocket == INVALID_SOCKET) {
        printf("Error at socket(): %ld\n", WSAGetLastError());
        freeaddrinfo(result);
        WSACleanup();
        return 1;
    }
    

다음 단계: 소켓 바인딩

윈삭과 함께하는 시작

Winsock 초기화

Winsock Server 애플리케이션