Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Při přidávání podpory protokolu IPv6 musíte zajistit, aby vaše aplikace definovala datové struktury správné velikosti. Velikost adresy IPv6 je mnohem větší než adresa IPv4. Struktury, které jsou pevně zakódované tak, aby zpracovávaly velikost IPv4 adresy při ukládání IP adresy, způsobí problémy v aplikaci a musí se upravit.
Osvědčený postup
Nejlepším přístupem k zajištění správné velikosti struktur je použití struktury SOCKADDR_STORAGE. Struktura SOCKADDR_STORAGE je nezávislá na verzi IP adresy. Pokud se SOCKADDR_STORAGE struktura používá k ukládání IP adres, adresy IPv4 a IPv6 je možné správně zpracovat pomocí jednoho základu kódu.
Následující příklad, což je výňatek ze souboru Server.c nalezeného v dodatku B, identifikuje vhodné použití SOCKADDR_STORAGE struktury. Všimněte si, že struktura, pokud se používá správně, jak ukazuje tento příklad, elegantně zpracovává adresu IPv4 nebo 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;
}
Poznámka
Struktura SOCKADDR_STORAGE je pro systém Windows XP nová.
Kód k vyhnutí
Mnoho aplikací obvykle používá strukturu sockaddr k ukládání adres nezávislých na protokolu nebo struktury sockaddr_in pro IP adresy. Struktura sockaddr ani struktura sockaddr_in není dostatečně velká pro uložení adres IPv6, a proto obě nejsou dostatečné, pokud je vaše aplikace kompatibilní s protokolem IPv6.
Úkol kódování
Úprava vaší existující kódové základny z IPv4 na interoperabilitu IPv4 a IPv6
- Získejte nástroj Checkv4.exe. Nástroj je součástí sady Microsoft Windows Software Development Kit (SDK).
- Spusťte nástroj Checkv4.exe proti kódu. Přečtěte si, jak spustit nástroj Checkv4.exe proti souborům v části Pomocí nástroje Checkv4.exe.
- Nástroj vás upozorní na použití sockaddr nebo sockaddr_in struktury a poskytuje doporučení, jak nahradit strukturu kompatibilní s protokolem IPv6 SOCKADDR_STORAGE.
- Nahraďte všechny takové instance a přidružený kód podle potřeby tak, aby používal strukturu SOCKADDR_STORAGE.
Případně můžete ve svém kódu hledat instance struktur sockaddr a sockaddr_in a veškeré takové použití (a další související kód dle potřeby) změnit na strukturu SOCKADDR_STORAGE.
Poznámka
Struktury addrinfo a SOCKADDR_STORAGE zahrnují členy rodiny protokolu a adres (ai_family a ss_family). RFC 2553 určuje ai_family člen addrinfo jako int, zatímco ss_family je zadán jako krátký; výsledkem přímé kopie mezi těmito členy je chyba kompilátoru.
Související témata
-
Průvodce IPv6 pro aplikace Windows Sockets