Sdílet prostřednictvím


Změna datových struktur pro aplikace winsock IPv6

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

  1. Získejte nástroj Checkv4.exe. Nástroj je součástí sady Microsoft Windows Software Development Kit (SDK).
  2. 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.
  3. 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.
  4. 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.

 

Průvodce IPv6 pro aplikace Windows Sockets

Dual-Stack Sokety pro aplikace Winsock protokolu IPv6

Volání funkcí pro aplikace Winsock IPv6

použití pevně zakódovaných adres IPv4

Problémy s uživatelským rozhraním pro IPv6 Winsock aplikace

Podkladové protokoly pro aplikace Winsock IPv6