Frage zur Netzwerkprogrammierung (connect())



  • Hallo Community,

    ich möchte gerne Netzwerkprogrammierung mit Sockets lernen. Dazu habe ich das Tutorial vom zotteljedi angeschaut und bin jetzt bei der ersten Implementierung des Clienten (Punkt 5).

    Mein Code ist folgender:

    #include <iostream>
    #include <string>
    #include <cstdlib>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netdb.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    
    using namespace std;
    
    /* Buffer Groesse bestimmen */
    const int BUF_SIZE=1024;
    
    int receive(int socket) {
    
    	char buffer[BUF_SIZE];
    
    	int bytes;
    
    	bytes=recv(socket, buffer, sizeof(buffer)-1, 0);
    
    	if(bytes == -1) {
    		cerr << "recv fehlgeschlagen" << endl;
    		return -1;
    	}
    
    	buffer[bytes]='\0';
    
    	cout << "Server: " << buffer << endl;
    
    	return 0;
    
    }
    
    int main() {
    
    	/* Socket deklarieren */
    	int s;
    	struct sockaddr_in srv;
    
    	/* IP-Adresse */
    	string ip="134.94.181.115";
    
    	/* Port */
    	int port = 5000;
    
    	/* Initialisieren des Sockets */
    	s = socket(AF_INET, SOCK_STREAM, 0);
    
    	if(s == -1) {
    		cerr << "socket() failed";
    		return 2;
    	}
    
    	/* Zieladresse festlegen */
    	srv.sin_addr.s_addr = inet_addr(ip.c_str());
    
    	/* Port festlegen */
    	srv.sin_port = htons(port);
    
    	/* Verbindungsart festlegen */
    	srv.sin_family = AF_INET;
    
    	/* Verbinden */
            /* Hier ist der Fehler */
    	if( connect(s, &srv, sizeof(&srv)) == -1) {
    		cerr << "connection failed" << endl;
    		return 3;
    	}
    
    	if(receive(s) == -1) {
    		cerr << "error in receive()" << endl;
    
    		return 4;
    	}
    
    	close(s);
    
    	return 0;
    
    }
    

    Die Fehlermeldung beim Kompilieren ist:

    ../Client.cpp: In function 'int main()':
    ../Client.cpp:70: error: cannot convert 'sockaddr_in*' to 'const sockaddr*' for argument '2' to 'int connect(int, const sockaddr*, socklen_t)'
    make: *** [Client.o] Error 1
    

    Aber genau so steht es auch im Beispielcode. Wo liegt der Fehler bei mir?

    Außerdem wuerde ich vorzugsweise C++ und nicht reines C benutzen. Gibt es dafür auch Alternativen oder reicht es, wenn ich den Teil in C schreibe (inkludieren der Header Dateien mit .h-Endung z.B.)



  • connect(s, (sockaddr*)&srv, sizeof(&srv))
    

    Auch wenn Leute mich jetzt wegen des C-Style-Casts steinigen 😉



  • Also die oben eingegebene IP-Adresse ist die von meinen Computer.
    Ist es dann normal, dass keine Verbindung hergestellt werden kann?

    Oder muss ich dazu parallel den Server laufen lassen?
    Ich blick da nicht so ganz durch.



  • Wenn kein Server läuft, der auf dem Port lauscht, kann natürlich keine Verbindung hergestellt werden. Dein eigener lokaler Rechner hat übrigens die IP 127.0.0.1


Anmelden zum Antworten