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 IPv6

    Typically, 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. sry 😛

    2. 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 = 16 🙂

    Nagut 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.


Log in to reply