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 상호 운용성으로 수정하려면
- Checkv4.exe 유틸리티를 가져옵니다. 이 유틸리티는 Microsoft Windows SDK(소프트웨어 개발 키트)에 포함되어 있습니다.
- 코드에 대해 Checkv4.exe 유틸리티를 실행합니다. Checkv4.exe 유틸리티 사용 섹션에서 파일에 대해 Checkv4.exe 유틸리티를 실행하는 방법에 대해 알아봅니다.
- 유틸리티는 sockaddr 또는 sockaddr_in 구조체의 사용을 경고하고 IPv6 호환 구조 SOCKADDR_STORAGE 교체하는 방법에 대한 권장 사항을 제공합니다.
- SOCKADDR_STORAGE 구조를 사용 하려면 이러한 인스턴스 및 관련 코드를 적절하게 바꿉니다.
또는 코드베이스에서 sockaddr 및 sockaddr_in 구조의 인스턴스를 검색하고 이러한 모든 사용(및 기타 관련 코드)을 SOCKADDR_STORAGE 구조체로 변경할 수 있습니다.
참고 항목
addrinfo 및 SOCKADDR_STORAGE 구조에는 프로토콜 및 주소 패밀리 멤버(ai_family 및 ss_family)가 각각 포함됩니다. RFC 2553은 addrinfo의 ai_family 멤버를 int로 지정하지만 ss_family 짧게 지정됩니다. 따라서 해당 멤버 간의 직접 복사로 인해 컴파일러 오류가 발생합니다.
관련 항목