Socket-Programmierung: getaddrinfo / socket() will kein IPv6;



  • Hallo,

    ich versuche eine Client-Anwendung zu programmieren, bei der die ganzen Adress-Informationen über getaddrinfo() geladen werden.
    Übergebe ich an getaddrinfo() eine IPv4-Adresse für den ersten Paramter *node, dann klappt es auch wie gewünscht. Übergebe ich jedoch eine IPv6-Adresse, bekomme ich nach dem socket()-Aufruf als Fehlermeldung: Invalid argument.

    Hier der Code (mit einer IPv6-Adresse in getaddrinfo() ):

    #include <string.h>	/* für memset() */ 
    #include <netdb.h>	/* für getaddrinfo() */ 
    #include <stdio.h>	/* für stderr, fprintf() */ 
    #include <stdlib.h>	/* für exit() */
    #include <unistd.h>	/* für close() */
    
    #define PORT "3490"
    
    int main (void) { 
    	struct addrinfo hints, *client_info, *p; 
    	memset (&hints, 0, sizeof hints); 
    	int rv, client_socket_fd; 
    
    	/* Randbedingungen der Adresse festlegen */ 
    	hints.ai_family = AF_UNSPEC;      /*egal, ob IPv4 oder IPv6 */ 
    	hints.ai_socktype = SOCK_STREAM;  /* Möchte einen Stream-Socket, also TCP */ 
    
    	/* Mit getaddrinfo in client_info mögliche Adressen laden */ 
    	if ((rv = getaddrinfo("fe80::ba27:ebff:fed5:d633", PORT, &hints, &client_info)) != 0) { 
    		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rv)); 
    	return 1; 
    	} 
    
    	/* Die durch getaddrinfo() erhaltenen Adressen durchlaufen und die erste für socket() verwenden */ 
    	for (p=client_info; p != NULL; p = p->ai_next) { 
    		if ((client_socket_fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) { 
    			perror("Client: socket"); 
    			continue; 
    		} 
    
    		if (connect(client_socket_fd, p->ai_addr, p->ai_addrlen) == -1) {
    			close(client_socket_fd);
    			perror("Client: connect");
    			continue;
    		}
    		break;
    
    	} /*for-Schleife*/
    
    	if (p == NULL) {
    		fprintf(stderr, "client: failed to connect\n");
    		return 2;
    	}
    }
    

    ==> Liefert:

    Client: connect: Invalid argument
    client: failed to connect
    

    (Das Ganze läuft auf Linux, kompiliert mit g++; Die oben angegeben IPv6-Adresse ist übrigens über ping6 -I et0 ... erreichbar).



  • was ist wenn du es statt mit hints.ai_family = AF_UNSPEC; mal explizit mit IP6 probierst? Die Fallunterscheidung IP4/6 also in deinem Programm machst.
    Klappt es dann?



  • dsdadada schrieb:

    was ist wenn du es statt mit hints.ai_family = AF_UNSPEC; mal explizit mit IP6 probierst? Die Fallunterscheidung IP4/6 also in deinem Programm machst.
    Klappt es dann?

    leider macht es keinen Unterschied. Auch wenn ich

    hints.ai_family = AF_UNSPEC
    

    durch

    hints.ai_family = AF_INET6;
    

    austausche,

    bleibt es bei dem selben, negativen Ergebnis



  • ping6 sagt bei mir zumindest: "network unreachable"



  • coder21 schrieb:

    ping6 sagt bei mir zumindest: "network unreachable"

    .... ähhh .... kann gerade nicht so ganz den Zusammenhang zu meinem Problem sehen. Ich habe den Hinweis mit ping6 gemacht, um zu zeigen, dass zumindest auf der Betriebssystemsebene/Konsolenebene/Netzwerkebene sich die Rechner finden (also, dass z.B. dumme Fehler wie Netzwerkkabel nicht eingesteckt, ausgeschlossen werden können).


Log in to reply