addrinfo kompatibel zu IPv6 ?
-
Hi, bin grad dabei mich mit den Änderungen von IPv6 vertraut zu machen.
Da bin ich auf etwas intersantes gestoßen. Laut der MSDN wäre sockaddr nicht kompatibel zu IPv6Typically, many applications used the sockaddr structure to store protocol-independent addresses, or the sockaddr_in structure for IP addresses. Neither the sockaddr structure nor the sockaddr_in structure is large enough to hold IPv6 addresses, and therefore both are insufficient if your application is to be IPv6 compatible.
Aber die Struktur
addrinfo
ist ja ansich für IPv6 gedacht oder nicht ?
So, aber der Aufbau sieht hier folgender Maßen aus:struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; size_t ai_addrlen; char *ai_canonname; struct sockaddr *ai_addr; //Aha ! struct addrinfo *ai_next; };
So, und wenn man sich nun die Implentierung von sockaddr ansieht:
struct sockaddr { u_short sa_family; char sa_data[14]; //sind das nicht 2 chars zuwenig für 128 bit ? };
So, nun stehe ich vor einem Verständnisproblem. Einerseits meint die MSDN
addrinfo sei dafür gedacht um NameResolving für IPv6 zu garantieren, andererseits werden Strukturen implemtiert, die das anscheined garnicht fassen können. Oder renn ich grad vor eine Wand ?Gruß Chris
-
1. gehört in den winapi threa
2. siehe msdn unter sockaddr_in6
-
ähmm
1. sry2. Hmm, ja es gibt in der Tat IPv6 Strukturen (in6_addr) aber die addrinfo hat eben als Adresse eine Variable vom Typp sockaddr... Oder was meinst du jetzt genau ?
-
Mir ist grade aufgefallen, dass sockaddr ja genau 16 bytes groß ist
short + 14 bytes = 16Nagut ich nehme an, so ist es dann geregelt...
-
ai_addr kann auch auf eine größere Struktur zeigen, deshalb gibts doch ai_addrlen. sizeof(sockaddr_in6) ist bei mir 28.
-
so hab ich das gemeint:
addrinfo hints,*results=NULL; char* name="altavista.ipv6.digital.com"; char* port="80"; sockaddr_in6 *erg; memset(&hints,0,sizeof(hints)); hints.ai_family=AF_INET6; hints.ai_socktype=SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; if(getaddrinfo(name,port,&hints,&results)!=0) { cout<<"Fehler bei getaddrinfo "<<::WSAGetLastError()<<endl; return 1; } if(results->ai_family|AF_INET6) { cout<<"Ipv6 ergebnis"<<endl; cout<<results->ai_addrlen<<" "<<sizeof(sockaddr_in)<<" "<<sizeof(sockaddr_in6)<<endl; erg=(sockaddr_in6*)results->ai_addr; }
hier kannst du sehen dass die größe der zurückgegebenen ai_addr gleich sockaddr_in6 ist und das du einfach casten musst.
greetings
Fencer
-
und wie kann ich dann eine Ipv6 Adresse umwandeln in einen string bzw. von string in eine Adresse ? inet_addr() gibt es ja für in_addr oder kann man da ruhig ohne bedenken casten ???
sockaddr_in6 test; inet_addr( reinterpret_cast<sockaddr_in*>(test)->sin_addr );
Gruß Chris
-
getnameinfo
-
inet_addr6
Zum Hintergrund nochmal:
Im Grunde genommen sind struct sockaddr_* Ableitungen von struct sockaddr. Nicht im Sinne von Objektorientierung, aber es soll das gleiche erreicht werden. Jede Funktion, die mit Sockets arbeitet, bekommt Zeiger auf struct sockaddr. Anhand der Adressfamilie (die in allen sockaddr_* Strukturen an derselben Stelle steht) und der Größe der Struktur weiss diese Funktion dann, ob es sich um sockaddr_in, sockaddr_in6, sockaddr_un, sockaddr_at etc. handelt. Das heisst aber nicht, dass man jede beliebige sockaddr_* Struktur auf eine andere sockaddr_* Struktur casten darf.
-
Ich will dich ja nicht iwie korrigieren.. aber inet_addr6 find ich garnicht bei google... ok 3-4 artikel.. aber sonst.. Ich habe auf der MSDN Seite RtlIpv6AddressToString gefunden, aber die gibet natürlcih nur für Windoof.
Wie geht das mit getnameinfo ?
-
Entschuldige, stimmt.
Ein Ersatz für inet_addr für v4 und v6 ist inet_pton
sockaddr_in a; a.sin_addr.s_addr = inet_addr("..."); // äquivalent ui sockaddr_in a; inet_pton(AF_INET, "...", &a.sin_addr); // für ipv6 sockaddr_in6 a; inet_pton(AF_INET6, "...", &a.sin6_addr);
-
ähm, diese Funktion gibts anscheinend nicht für Windows, sprich ich muss "RtlIpv6AddressToString" oder so ähnlich für windows benutzen richtig ?
-
In Winsock gibt es WSAStringToAddress. RtlIpv6StringToAddress ist eine Bibliotheksfunktion, die laut MSDN zwar kein Winsock braucht, aber nicht im PSDK sondern nur im DDK/WDK enthalten ist (was auch immer das für einen Sinn haben mag).
-
Foxx90 du bist dumm, mehr kann man dazu eigentlich nicht sagen
-
netter beitrag
-
Wie geht das mit getnameinfo?
http://msdn.microsoft.com/en-us/library/ms738532.aspx
Unten auf der Seite ist ein Beispiel.
-
Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.