Socket, connect() funktioniert trotz ungültiger Adresse.



  • Hallo,

    ich habe gestern einmal mich mit der Socketprogrammierung befasst. Es hat auch soweit alles geklappt, wie mir scheint, aber aus irgendeinem Grund trifft

    if( !connect( /* parameter */ ) )
    {
        /*
         *  Fehlermeldung & return -1
         */
    }
    

    niemals zu.

    #include <iostream>
    #include <sys/socket.h>
    #include <unistd.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    using namespace std;
    
    int main()
    {
    	int sock, sockConnect;
    	struct sockaddr_in addr;
    
    	sock = socket( AF_INET, SOCK_STREAM, 0 );
    	if( !sock )
    	{
    		cerr << __FILE__
    			 << ':'
    			 << __LINE__
    			 << ":socket() failed"
    			 << endl;
    		return -1;
    	}
    
    	addr.sin_family = AF_INET;
    	addr.sin_port = htons( 80 );
    	addr.sin_addr.s_addr = inet_addr( "641" ); //Google: 72.14.221.104
    
    	sockConnect = connect( sock, (struct sockaddr*) &addr, sizeof( addr ) );
    	if( !sock )
    	{
    		cerr << __FILE__
    			 << ':'
    			 << __LINE__
    			 << ":connect() failed"
    			 << endl;
    		return -2;
    	}
    
    	close( sock );
    	return 0;
    }
    

    Auf Zeile 26 meines Codes lege ich die Adresse fest. Ich habe anfangs zum Test die Google-IP verwendet und da ich keine Fehlermeldung bekam, dachte ich mir, alles würde funktionieren. Doch als ich zum Testen die IP zufällig geändert hatte, ist mir aufgefallen, dass so oder so keine Fehlermeldung kommt. Wieso das?

    Danke
    Squall



  • inet_addr() liefert bei einem fehler -1 zurück. welches der ip-adresse 255.255.255.255 enspricht, also eine gültige adresse. inet_aton() ist da etwas
    besser. damit kannst du besser überprüfen, ob etwas schief gelaufen ist.



  • Du hast den Rückgabewert von connect() in "sockConnect" abgelegt und fragst anschließend ab, ob "sock" intakt ist - ist das beabsichtigt?



  • Das liegt daran, dass der Rückgabewert weder von socket noch von connect im Fehlerfall "false" ist. Für socket gilt, dass 0 sowie alle positiven Zahlen durchaus gültige Sockets sind, für connect ist 0 sogar der einzige Erfolgsgfall. Fehler ist -1.

    Ausserdem musst Du nach dem connect auch den Rückgabewert von connect prüfen, der Wert von sock wird sich nicht mehr ändern.



  • Okay danke.
    Ich hatte nicht ganz beachtet, dass ich dort ja auch eine Funktion verwende.
    Nun funktioniert es. 🙂

    Gruß
    Squall


Log in to reply