다음을 통해 공유


IPv6 Winsock Appications에 대한 데이터 구조 변경

IPv6에 대한 지원을 추가할 때 애플리케이션에서 적절한 크기의 데이터 구조를 정의해야 합니다. IPv6 주소의 크기는 IPv4 주소보다 훨씬 큽니다. IP 주소를 저장할 때 IPv4 주소의 크기를 처리하기 위해 하드 코딩된 구조체는 애플리케이션에 문제를 발생시키고 수정해야 합니다.

모범 사례

구조체의 크기를 적절하게 조정하는 가장 좋은 방법은 SOCKADDR_STORAGE 구조를 사용하는 것입니다. SOCKADDR_STORAGE 구조는 IP 주소 버전과 관련이 없습니다. ip 주소를 저장하는 데 SOCKADDR_STORAGE 구조를 사용하면 하나의 코드 베이스로 IPv4 및 IPv6 주소를 올바르게 처리할 수 있습니다.

부록 B에 있는 Server.c 파일에서 발췌한 다음 예제는 SOCKADDR_STORAGE 구조체의 적절한 사용을 식별합니다. 이 예제와 같이 구조체를 제대로 사용하면 IPv4 또는 IPv6 주소를 정상적으로 처리합니다.

#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>

#pragma comment(lib, "Ws2_32.lib")

#define BUFFER_SIZE 512
#define DEFAULT_PORT "27015"

int main(int argc, char **argv)
{
    char Buffer[BUFFER_SIZE] = {0};
    char *Hostname;
    int Family = AF_UNSPEC;
    int SocketType = SOCK_STREAM;
    char *Port = DEFAULT_PORT;
    char *Address = NULL;
    int i = 0;
    DWORD dwRetval = 0;
    int iResult = 0;
    int FromLen = 0;
    int AmountRead = 0;

    SOCKADDR_STORAGE From;

    WSADATA wsaData;

    ADDRINFO *AddrInfo = NULL;
    ADDRINFO *AI = NULL;

    // Parse arguments
    if (argc >= 1) {
        Hostname = argv[1];
    }    

   // Initialize Winsock
    iResult = WSAStartup(MAKEWORD(2, 2), &wsaData);
    if (iResult != 0) {
        printf("WSAStartup failed: %d\n", iResult);
        return 1;
    }

    From.ss_family = (ADDRESS_FAMILY) Family;
    
    //...
        
        return 0;
}

참고 항목

SOCKADDR_STORAGE 구조는 Windows XP의 새로운 기능입니다.

 

방지할 코드

일반적으로 많은 애플리케이션은 sockaddr 구조를 사용하여 프로토콜 독립적 주소 또는 IP 주소에 대한 sockaddr_in 구조를 저장했습니다. sockaddr 구조나 sockaddr_in 구조는 IPv6 주소를 보유할 만큼 충분히 크지 않으므로 애플리케이션이 IPv6과 호환되는 경우 둘 다 충분하지 않습니다.

코딩 작업

기존 코드 베이스를 IPv4에서 IPv4 및 IPv6 상호 운용성으로 수정하려면

  1. Checkv4.exe 유틸리티를 가져옵니다. 이 유틸리티는 Microsoft Windows SDK(소프트웨어 개발 키트)에 포함되어 있습니다.
  2. 코드에 대해 Checkv4.exe 유틸리티를 실행합니다. Checkv4.exe 유틸리티 사용 섹션에서 파일에 대해 Checkv4.exe 유틸리티를 실행하는 방법에 대해 알아봅니다.
  3. 유틸리티는 sockaddr 또는 sockaddr_in 구조체의 사용을 경고하고 IPv6 호환 구조 SOCKADDR_STORAGE 교체하는 방법에 대한 권장 사항을 제공합니다.
  4. SOCKADDR_STORAGE 구조를 사용 하려면 이러한 인스턴스 및 관련 코드를 적절하게 바꿉니다.

또는 코드베이스에서 sockaddr 및 sockaddr_in 구조의 인스턴스를 검색하고 이러한 모든 사용(및 기타 관련 코드)을 SOCKADDR_STORAGE 구조체로 변경할 수 있습니다.

참고 항목

addrinfoSOCKADDR_STORAGE 구조에는 프로토콜 및 주소 패밀리 멤버(ai_familyss_family)가 각각 포함됩니다. RFC 2553은 addrinfo ai_family 멤버를 int로 지정하지만 ss_family 짧게 지정됩니다. 따라서 해당 멤버 간의 직접 복사로 인해 컴파일러 오류가 발생합니다.

 

Windows 소켓 애플리케이션용 IPv6 가이드

IPv6 Winsock 애플리케이션용 이중 스택 소켓

IPv6 Winsock 애플리케이션에 대한 함수 호출

하드 코딩된 IPv4 주소 사용

IPv6 Winsock 애플리케이션에 대한 사용자 인터페이스 문제

IPv6 Winsock 애플리케이션에 대한 기본 프로토콜