Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podczas dodawania obsługi protokołu IPv6 należy upewnić się, że aplikacja definiuje prawidłowo rozmiar struktur danych. Rozmiar adresu IPv6 jest znacznie większy niż adres IPv4. Struktury, które są zakodowane w celu obsługi rozmiaru adresu IPv4 podczas przechowywania adresu IP, spowodują problemy w aplikacji i muszą zostać zmodyfikowane.
Najlepsze rozwiązanie
Najlepszym podejściem do zapewnienia prawidłowego rozmiaru struktur jest użycie struktury SOCKADDR_STORAGE. Struktura SOCKADDR_STORAGE jest niezależna od wersji adresu IP. Gdy struktura SOCKADDR_STORAGE jest używana do przechowywania adresów IP, adresy IPv4 i IPv6 mogą być prawidłowo obsługiwane za pomocą jednej bazy kodu.
Poniższy przykład, który jest fragmentem pobranym z pliku Server.c znalezionego w dodatku B, identyfikuje odpowiednie użycie struktury SOCKADDR_STORAGE. Zwróć uwagę, że struktura, jeśli jest używana prawidłowo, jak pokazano w tym przykładzie, bezpiecznie obsługuje adres IPv4 lub 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;
}
Notatka
Struktura SOCKADDR_STORAGE jest nowa dla systemu Windows XP.
Kod do unikania
Zazwyczaj wiele aplikacji używa struktury sockaddr do przechowywania adresów niezależnych od protokołu lub struktury sockaddr_in adresów IP. Ani struktura sockaddr, ani struktura sockaddr_in nie jest wystarczająco duża, aby przechowywać adresy IPv6, a zatem obie są niewystarczające, jeśli aplikacja ma być zgodna z protokołem IPv6.
Zadanie kodowania
Aby zmodyfikować istniejącą bazę kodu z protokołu IPv4 na współdziałanie protokołów IPv4 i IPv6
- Uzyskaj narzędzie Checkv4.exe. Narzędzie jest dołączone do zestawu Microsoft Windows Software Development Kit (SDK).
- Uruchom narzędzie Checkv4.exe względem kodu. Dowiedz się, jak używać narzędzia Checkv4.exe na swoich plikach w sekcji Korzystanie z narzędzia Checkv4.exe.
- Narzędzie wysyła alerty dotyczące użycia struktur sockaddr lub sockaddr_in i zawiera zalecenia dotyczące ich zastąpienia strukturą zgodną z IPv6, taką jak SOCKADDR_STORAGE.
- Zastąp wszystkie te wystąpienia oraz powiązany kod, jeśli to konieczne, aby użyć struktury SOCKADDR_STORAGE.
Alternatywnie możesz wyszukać w bazie kodu wystąpienia struktur sockaddr i sockaddr_in oraz zmienić wszystkie takie użycie (oraz inny skojarzony kod, jak to stosowne) na strukturę SOCKADDR_STORAGE.
Notatka
Struktury addrinfo i SOCKADDR_STORAGE zawierają członków rodziny protokołów i adresów (ai_family i ss_family), odpowiednio. RFC 2553 określa element ai_familyaddrinfo jako int, podczas gdy ss_family jest określony jako short; w związku z tym bezpośrednie skopiowanie między tymi elementami powoduje błąd kompilatora.
Tematy pokrewne
-
Dual-Stack Gniazda dla aplikacji Winsock korzystających z IPv6
-
Wywołania funkcji dla aplikacji Winsock korzystających z protokołu IPv6
-
problemy z interfejsem użytkownika dla aplikacji IPv6 Winsock