Client Anwendung mit IPv6: connect() --> Invalid argument / Network is unreachable



  • Hallo,

    ich möchte eine eigene Serveranwendung auf einem Zielrechner mit einem Client über IPv6 ansprechen. Der Zielrechner ist auch über IPv6 erreichbar:

    $ping6 -I eth0 fe80::ba27:ebff:fed5:d633
    PING fe80::ba27:ebff:fed5:d633(fe80::ba27:ebff:fed5:d633) from fe80::230:67ff:feb1:e3cf eth0: 56 data bytes
    64 bytes from fe80::ba27:ebff:fed5:d633: icmp_seq=1 ttl=64 time=0.572 ms
    64 bytes from fe80::ba27:ebff:fed5:d633: icmp_seq=2 ttl=64 time=0.722 ms
    

    Mein Problem liegt momentan bei der Client-Anwendung, da ich leider nicht so richtig weiß, wie man die IP-Adresse vom Zielrechner dem sockaddr_in6 Datentyp zuweist. In meinem ersten Versuch habe ich es so gemacht:

    inet_pton(AF_INET6, "fe80::ba27:ebff:fed5:d633", &server_address.sin6_addr);
    

    --> Bei Programausführung wurde dann nach connect() die Fehlermeldung

    Invalid argument

    ausgegeben.

    Der komplette Quellcode:

    #include <stdio.h>	/* für perror() */ 
    #include <sys/socket.h>	/* für socket() */ 
    #include <unistd.h>	/* für close()*/ 
    #include <netinet/in.h>	/* für struct sockaddr */ 
    #include <stdlib.h>	/* for exit() */ 
    #include <errno.h>	/* für errno */ 
    #include <arpa/inet.h>	/* für inet_addr */
    
    int main() {
    
    int client_fd, x;
    
    /*** Anlegen der Zieladresse ***/
    struct sockaddr_in6 server_address;
    server_address.sin6_family=AF_INET6;
    server_address.sin6_port=htons(9734);
    inet_pton(AF_INET6, "fe80::ba27:ebff:fed5:d633", &server_address.sin6_addr);
    
    /**** Anlegen eines Sockets ****/
    client_fd = socket(PF_INET6, SOCK_STREAM, 0); 
    if (client_fd < 0) { 
    	  printf("Socket kann nicht erstellt werden.\n"); 
    	  perror("socket error"); 
    	  close(client_fd); 
    	  exit(errno); 
    }
    
    /*** Aufbauen der Verbindung ***/
    	if (connect(client_fd, (struct sockaddr*)&server_address, sizeof(server_address)) < 0) {
    		perror("Verbindungsfehler");
    		exit(errno);
    	}
    	printf("established.\n");
    }
    

    Um dem Problem näher zu kommen, wollte ich mir dann ansehen was inet_pton zurück liefert und habe den Rückgabewert x zugeordnet:

    x=inet_pton(AF_INET6, "fe80::ba27:ebff:fed5:d633", &server_address.sin6_addr);
    

    Der komplette Rest blieb unverändert. Doch nun kommt nach connect() als Fehlermeldung:

    Network is unreachable.

    (Anm. x hatte übrigens den Wert 1)

    Somit ergeben sich mir zwei Fragen:

    1. Warum bekommen ich zwei unterschiedliche Fehlermeldungen? Die Zuweisung des Rückgabewertes von inet_pton() zu einer Integer-Variablen dürfte doch auf den Verbindungsaufbau keinen Einflusss haben;
    2. Warum funktioniert mein connect()-Verbindungsaufbau nicht.

    (Hinweis: bin c++ Neuling :p )

    Danke vorab für eure Kommentare/Hilfe



  • BigMan200 schrieb:

    (Hinweis: bin c++ Neuling :p )

    Das ist C.



  • Nathan schrieb:

    BigMan200 schrieb:

    (Hinweis: bin c++ Neuling :p )

    Das ist C.

    Bin c++ und C Neuling
    (und wie hilft mir dies bei meinem Problem 🙄)



  • BigMan200 schrieb:

    Nathan schrieb:

    BigMan200 schrieb:

    (Hinweis: bin c++ Neuling :p )

    Das ist C.

    Bin c++ und C Neuling
    (und wie hilft mir dies bei meinem Problem 🙄)

    So gefragt: Gar nicht.
    Aber es hilft dir eventuell bei deinem späteren Lernen. Denn wenn du etwas lernst, was du für etwas anderes hälst als es ist, ist das nicht ganz so toll.
    Und C++ und C gleichzeitig zu machen ist ... ungünstig.
    Trotz ihrer Ähnlichkeit sind das zwei verschiedene Sprachen, mit zwei verschiedenen Möglichkeiten und zwei verschiedene Arten zu programmieren.
    Aber das nur btw.



  • Nathan schrieb:

    BigMan200 schrieb:

    Nathan schrieb:

    BigMan200 schrieb:

    (Hinweis: bin c++ Neuling :p )

    Das ist C.

    Bin c++ und C Neuling
    (und wie hilft mir dies bei meinem Problem 🙄)

    So gefragt: Gar nicht.
    Aber es hilft dir eventuell bei deinem späteren Lernen. Denn wenn du etwas lernst, was du für etwas anderes hälst als es ist, ist das nicht ganz so toll.
    Und C++ und C gleichzeitig zu machen ist ... ungünstig.
    Trotz ihrer Ähnlichkeit sind das zwei verschiedene Sprachen, mit zwei verschiedenen Möglichkeiten und zwei verschiedene Arten zu programmieren.
    Aber das nur btw.

    Meine Annahme: C++ = Ergänzung bzw. Erweiterung von C:
    Folgerung: was ein C Code ist, ist automatische auch ein C++ Code (aber nicht umgekehrt).
    Falls meine Annahme = unwahr; dann bitte nicht schlagen .. bin ich dann auch im falschen Forum, da hier nur C++.

    Aber es ist schon richtig, dass ich in meinem Code keine C++ typischen Merkmale oder Möglichkeiten wie Objekt-Orientierung etc. brauche oder verwende.

    Nun denn, jetzt gehe ich mal davon aus, dass ich hier nicht im falschen Forum bin, wie komme ich dann zu einer Lösung zu meiner C-Code-Problem? 🙂



  • BigMan200 schrieb:

    Nathan schrieb:

    BigMan200 schrieb:

    Nathan schrieb:

    BigMan200 schrieb:

    (Hinweis: bin c++ Neuling :p )

    Das ist C.

    Bin c++ und C Neuling
    (und wie hilft mir dies bei meinem Problem 🙄)

    So gefragt: Gar nicht.
    Aber es hilft dir eventuell bei deinem späteren Lernen. Denn wenn du etwas lernst, was du für etwas anderes hälst als es ist, ist das nicht ganz so toll.
    Und C++ und C gleichzeitig zu machen ist ... ungünstig.
    Trotz ihrer Ähnlichkeit sind das zwei verschiedene Sprachen, mit zwei verschiedenen Möglichkeiten und zwei verschiedene Arten zu programmieren.
    Aber das nur btw.

    Meine Annahme: C++ = Ergänzung bzw. Erweiterung von C:
    Folgerung: was ein C Code ist, ist automatische auch ein C++ Code (aber nicht umgekehrt).
    Falls meine Annahme = unwahr; dann bitte nicht schlagen .. bin ich dann auch im falschen Forum, da hier nur C++.

    Deine Annahme stimmt. Für den Compiler ist (von einigen Kleinigkeiten mal abgesehen) C-Code C++-Code.
    Aber wenn du in C++ C programmierst, nutzt du das Potenzial von C++ nicht.



  • BigMan200 schrieb:

    (und wie hilft mir dies bei meinem Problem 🙄)

    Gar nicht. Das liegt aber daran, dass du weder ein C++- noch ein C-Problem hast, sondern mit dem Socket-API deines Betriebssystems (Linux?) => falsches Forum.

    Da ich mit sockets selten zu tun habe, kann ich dir auch nicht spontan weiterhelfen. Wenn du allerdings C++ programmieren möchtest, kann ich boost.asio empfehlen.



  • manni66 schrieb:

    Das liegt aber daran, dass du weder ein C++- noch ein C-Problem hast, sondern mit dem Socket-API deines Betriebssystems (Linux?) => falsches Forum.

    Das ist doch schon mal ein konstruktiver Hinweis, der mich in eine neue Richtung schuppst. Irgendwie war ich nur auf meinen Quellcode fixiert, aber dass mein Betriebssystem (=Debian-Linux) "verdreht" sein könnte, daran hatte ich nicht noch nicht gedacht.

    ... jetzt würden mir aber die Leute im Linux-Forum wahrscheinlich sagen: geh' mit deinem C-Programm in ein C-Forum 🤡

    Muss wohl mal schauen, ob ich sowas wie ein Socket-Programmierungsforum finde.



  • BigMan200 schrieb:

    ... dass mein Betriebssystem (=Debian-Linux) "verdreht" sein könnte, daran hatte ich nicht noch nicht gedacht.

    Ich würde jetzt eher annehmen, das du das API falsch benutzt. Das hat aber immer noch nichts mit C++ oder C zu tun.

    Wenn andere Programme IPv6 Verbindungen herstellen können, sollte das Betriebssystem soweit in Ordnung sein.



  • [gelöscht]


Anmelden zum Antworten