Share via


클라이언트에 대한 소켓 만들기

초기화 후 클라이언트에서 사용할 SOCKET 개체를 인스턴스화해야 합니다.

소켓을 만들려면

  1. sockaddr 구조체가 포함된 addrinfo 개체를 선언하고 이러한 값을 초기화합니다. 이 애플리케이션의 경우 IPv6 또는 IPv4 주소를 반환할 수 있도록 인터넷 주소 패밀리가 지정되지 않습니다. 애플리케이션은 소켓 유형을 TCP 프로토콜의 스트림 소켓으로 요청합니다.

    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;
    
  2. 명령줄에 전달된 서버 이름의 IP 주소를 요청하는 getaddrinfo 함수를 호출합니다. 클라이언트가 연결할 서버의 TCP 포트는 이 샘플에서 DEFAULT_PORT 27015로 정의됩니다. getaddrinfo 함수는 해당 값을 오류를 검사하는 정수로 반환합니다.

    #define DEFAULT_PORT "27015"
    
    // Resolve the server address and port
    iResult = getaddrinfo(argv[1], DEFAULT_PORT, &hints, &result);
    if (iResult != 0) {
        printf("getaddrinfo failed: %d\n", iResult);
        WSACleanup();
        return 1;
    }
    
  3. ConnectSocket이라는 SOCKET 개체를 만듭니다.

    SOCKET ConnectSocket = INVALID_SOCKET;
    
  4. 소켓 함수를 호출하고 해당 값을 ConnectSocket 변수로 반환합니다. 이 애플리케이션의 경우 호출에서 반환된 첫 번째 IP 주소를 사용하여 hints 매개 변수에 지정된 주소 패밀리, 소켓 유형 및 프로토콜과 일치하는 getaddrinfo를 사용합니다. 이 예제에서는 소켓 형식의 SOCK_STREAM 및 IPPROTO_TCP 프로토콜을 사용하여 TCP 스트림 소켓을 지정했습니다. 주소 패밀리가 지정되지 않은 상태로 남아 있으므로(AF_UNSPEC) 반환된 IP 주소는 서버의 IPv6 또는 IPv4 주소일 수 있습니다.

    클라이언트 애플리케이션이 IPv6 또는 IPv4만 사용하여 연결하려는 경우 주소 패밀리를 IPv6 의 경우 AF_INET6 설정하거나 힌트 매개 변수에서 IPv4용 AF_INET 설정해야 합니다.

    // Attempt to connect to the first address returned by
    // the call to getaddrinfo
    ptr=result;
    
    // Create a SOCKET for connecting to server
    ConnectSocket = socket(ptr->ai_family, ptr->ai_socktype, 
        ptr->ai_protocol);
    
  5. 소켓이 유효한 소켓인지 확인하려면 오류를 확인합니다.

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

소켓 함수에 전달된 매개 변수는 다양한 구현에 대해 변경할 수 있습니다.

오류 검색은 성공적인 네트워킹 코드의 핵심 부분입니다. 소켓 호출이 실패하면 INVALID_SOCKET 반환합니다. 이전 코드의 if 문은 소켓을 만드는 동안 발생할 수 있는 오류를 catch하는 데 사용됩니다. WSAGetLastError 는 발생한 마지막 오류와 관련된 오류 번호를 반환합니다.

참고

애플리케이션에 따라 보다 광범위한 오류 검사가 필요할 수 있습니다.

예를 들어 hints.ai_family AF_UNSPEC 설정하면 연결 호출 이 실패할 수 있습니다. 이 경우 특정 IPv4(AF_INET) 또는 IPv6(AF_INET6) 값을 대신 사용합니다.

WSACleanup 은 WS2_32 DLL 사용을 종료하는 데 사용됩니다.

다음 단계: 소켓에 연결

윈삭과 함께하는 시작

Winsock 초기화

Winsock 클라이언트 애플리케이션