addrinfo kompatibel zu IPv6 ?
-
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.