Modifica delle strutture di dati per le app Winsock IPv6
Quando si aggiunge il supporto per IPv6, è necessario assicurarsi che l'applicazione definisca strutture di dati di dimensioni appropriate. Le dimensioni di un indirizzo IPv6 sono molto più grandi di un indirizzo IPv4. Le strutture hardcoded per gestire le dimensioni di un indirizzo IPv4 durante l'archiviazione di un indirizzo IP causeranno problemi nell'applicazione e devono essere modificate.
Procedure consigliate
L'approccio migliore per garantire che le strutture siano dimensionati correttamente consiste nell'usare la struttura SOCKADDR_STORAGE. La struttura SOCKADDR_STORAGE è indipendente dalla versione dell'indirizzo IP. Quando la struttura SOCKADDR_STORAGE viene usata per archiviare gli indirizzi IP, gli indirizzi IPv4 e IPv6 possono essere gestiti correttamente con una codebase.
L'esempio seguente, che è un estratto tratto dal file Server.c trovato nell'Appendice B, identifica un uso appropriato della struttura SOCKADDR_STORAGE . Si noti che la struttura, se usata correttamente come illustrato in questo esempio, gestisce normalmente un indirizzo IPv4 o 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;
}
Nota
La struttura SOCKADDR_STORAGE è nuova per Windows XP.
Codice da evitare
In genere, molte applicazioni usavano la struttura sockaddr per archiviare indirizzi indipendenti dal protocollo o la struttura sockaddr_in per gli indirizzi IP. Né la struttura sockaddr né la struttura sockaddr_in è abbastanza grande da contenere indirizzi IPv6 e pertanto entrambi sono insufficienti se l'applicazione deve essere compatibile con IPv6.
Attività di codifica
Per modificare la codebase esistente da IPv4 a IPv4 e interoperabilità IPv6
- Acquisire l'utilità Checkv4.exe. L'utilità è inclusa in Microsoft Windows Software Development Kit (SDK).
- Eseguire l'utilità Checkv4.exe sul codice. Informazioni su come eseguire l'utilità Checkv4.exe sui file nella sezione Uso dell'utilità Checkv4.exe.
- L'utilità avvisa l'utilizzo delle strutture sockaddr o sockaddr_in e fornisce consigli su come sostituire con la struttura compatibile con IPv6 SOCKADDR_STORAGE.
- Sostituire eventuali istanze di questo tipo e il codice associato in base alle esigenze per usare la struttura SOCKADDR_STORAGE .
In alternativa, è possibile cercare nella base di codice le istanze delle strutture sockaddr e sockaddr_in e modificare tutto questo utilizzo (e altro codice associato, in base alle esigenze) alla struttura SOCKADDR_STORAGE .
Nota
Le strutture addrinfo e SOCKADDR_STORAGE includono rispettivamente i membri del protocollo e della famiglia di indirizzi (ai_family e ss_family). RFC 2553 specifica il membro ai_family di addrinfo come int, mentre ss_family viene specificato come breve. Di conseguenza, una copia diretta tra tali membri genera un errore del compilatore.
Argomenti correlati