Delen via


Gegevensstructuren wijzigen voor IPv6 Winsock-appications

Wanneer u ondersteuning voor IPv6 toevoegt, moet u ervoor zorgen dat uw toepassing gegevensstructuren op de juiste manier definieert. De grootte van een IPv6-adres is veel groter dan een IPv4-adres. Structuren die in code zijn vastgelegd om de grootte van een IPv4-adres te verwerken wanneer een IP-adres wordt opgeslagen, veroorzaken problemen in uw toepassing en moeten worden gewijzigd.

Aanbevolen procedure

De beste manier om ervoor te zorgen dat uw structuren de juiste maat hebben, is door de SOCKADDR_STORAGE structuren te gebruiken. De SOCKADDR_STORAGE structuur is agnostisch voor ip-adresversie. Wanneer de SOCKADDR_STORAGE structuur wordt gebruikt voor het opslaan van IP-adressen, kunnen IPv4- en IPv6-adressen correct worden verwerkt met één codebasis.

In het volgende voorbeeld, een fragment uit het bestand Server.c dat in bijlage B is gevonden, wordt een geschikt gebruik van de SOCKADDR_STORAGE structuur geïdentificeerd. U ziet dat de structuur, wanneer deze correct wordt gebruikt zoals in dit voorbeeld wordt weergegeven, een IPv4- of IPv6-adres correct verwerkt.

#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;
}

Notitie

De SOCKADDR_STORAGE structuur is nieuw voor Windows XP.

 

Code om te vermijden

Meestal gebruikten veel toepassingen de sockaddr structuur voor het opslaan van protocolonafhankelijke adressen of de sockaddr_in structuur voor IP-adressen. De sockaddr-structuur noch de sockaddr_in-structuur is groot genoeg om IPv6-adressen op te slaan, en daarom is geen van beide voldoende als uw toepassing IPv6-compatibel is.

Codeertaak

Uw bestaande codebasis wijzigen van IPv4 in IPv4- en IPv6-interoperabiliteit

  1. Verkrijg het hulpprogramma Checkv4.exe. Het hulpprogramma is opgenomen in de Microsoft Windows Software Development Kit (SDK).
  2. Voer het hulpprogramma Checkv4.exe uit op uw code. Meer informatie over het uitvoeren van het hulpprogramma Checkv4.exe op uw bestanden in de sectie over Het Gebruik van Het Hulpprogramma Checkv4.exe.
  3. Het hulpprogramma waarschuwt u voor het gebruik van sockaddr of sockaddr_in structuren, en biedt aanbevelingen voor het vervangen van een van beide door de IPv6-compatibele structuur SOCKADDR_STORAGE.
  4. Vervang dergelijke voorvallen en de bijbehorende code waar nodig om de structuur SOCKADDR_STORAGE te gebruiken.

U kunt ook in uw codebasis zoeken naar exemplaren van de sockaddr-- en sockaddr_in structuren, en al dit gebruik (en andere gekoppelde code, indien van toepassing) wijzigen in de SOCKADDR_STORAGE structuur.

Notitie

De addrinfo-- en SOCKADDR_STORAGE structuren omvatten respectievelijk protocol- en adresfamilieleden (ai_family en ss_family), respectievelijk. RFC 2553 specificeert het ai_family lid van addrinfo als een int, terwijl ss_family is opgegeven als een korte; Als zodanig resulteert een directe kopie tussen deze leden in een compilerfout.

 

IPv6-handleiding voor Windows Sockets-toepassingen

Dual-Stack Sockets voor IPv6 Winsock-toepassingen

functieoproepen voor IPv6 Winsock-toepassingen

Gebruik van in code vastgelegde IPv4-adressen

problemen met de gebruikersinterface voor IPv6 Winsock-toepassingen

onderliggende protocollen voor IPv6 Winsock-toepassingen