[gelöst] Client/Server - Probleme mit recv()



  • Hallo erstmal,
    ich beschäftige mich seit 2 Tagen mit der Netzwerkprogrammierung unter C/C++,
    bin in diesem Themenbereich also noch absoluter Neuling.
    Nachdem ich mich durch sämtliche Tutorials gewühlt habe, habe ich mich schließlich an ein eigenes Client-Server Projekt rangewagt - leider nur mit mäßigem Erfolg.
    Ich habe 2 Projekte angelegt: eins für den Klienten und eins für den Server.

    //server.cpp
    #include <iostream>
    #include <sqlite3.h>
    #include <string>
    #include <winsock2.h>
    using namespace std;
    
    int main()
    {
    	WSADATA wsaData;
    	int starterr = WSAStartup( MAKEWORD( 2,2 ), &wsaData );
    	if (starterr !=0)
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system ("pause >nul");
    		WSACleanup();
    		return 0;
    	}
    	cout << "WSAStartup erfolgreich!" << endl;
    
    	SOCKET server = socket( AF_INET,SOCK_STREAM,0 );
    	if ( server == INVALID_SOCKET )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system( "pause >nul" );
    		WSACleanup();
    		return 0;
    	}
    	cout << "Socket erfolgreich erstellt!" << endl;
    
    	sockaddr_in addr;
    	addr.sin_port = htons(12345);
    	addr.sin_addr.s_addr = INADDR_ANY;
    	addr.sin_family = AF_INET;
    	if ( bind ( server, ( sockaddr* )&addr, sizeof( addr ) ) == SOCKET_ERROR )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system( "pause >nul" );
    		WSACleanup ();
    		return 0;
    	}
    	cout << "Verbindung erfolgreich erstellt!" << endl;
    
    	if ( listen( server,SOMAXCONN ) == SOCKET_ERROR )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system ( "pause >nul" );
    		WSACleanup();
    		return 0;
    	}
    	cout << "Socket für Verbindungen erfolgreich geöffnet!" << endl;
    	while( listen( server, SOMAXCONN ) == SOCKET_ERROR );
    
    	SOCKET client;
    
    	client = accept( server,NULL,NULL );
    	if ( client == INVALID_SOCKET )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system( "pause >nul");
    		WSACleanup();
    		return 0;
    	}
    	cout << "Erfolgreich mit Clienten verbunden!" << endl;
    
    	char buf[256] = "Hello Client\n";
    	send( server,buf,sizeof( buf ),0 );
    
    	/////////////////////////////////////////////////////////////////////////////////
    	/////////////////////////////////////////////////////////////////////////////////
    	// Ab hier: Database Implementierung
    	/////////////////////////////////////////////////////////////////////////////////
    	/////////////////////////////////////////////////////////////////////////////////
    	sqlite3* Database;
    	string Path = "C:\Users\Chrissi\Desktop\Programmieren\Projekte\Netzwerkprogrammierung\Server++\db.sql";
    
    	if ( sqlite3_open( Path.c_str(), &Database ) != SQLITE_OK )
    	{
    		cout << "Fehler beim Oeffnen: " << sqlite3_errmsg( Database ) << " aufgetreten!" << endl;
    		system( "pause >nul" );
    		return 1;
    	}
    	cout << "Datenbank erfolgreich geöffnet!" << endl;
    
    	sqlite3_close( Database );
    	cout << "Datenbank geschlossen!" << endl;
    
    	closesocket( server );
    	closesocket( client );
    	WSACleanup();
    
    	system( "PAUSE" );
    	return 0;
    
    }
    

    und hier der Klient:

    #include <iostream>
    #include <winsock2.h>
    using namespace std;
    
    int main()
    {
    	WSADATA wsaData;
    	int starterr = WSAStartup( MAKEWORD( 2,2 ),&wsaData );
    	if ( starterr != 0 )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system( "pause >nul" );
    		WSACleanup();
    		return 0;
    	}
    	cout << "WSAStartup erfolgreich!" << endl;
    
    	SOCKET server = socket( AF_INET,SOCK_STREAM,0 );
    	if ( server == INVALID_SOCKET )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten" << endl;
    		system( "pause >nul" );
    		WSACleanup();
    		return 0;
    	}
    	cout << "Socket erfolgreich erstellt!" << endl;
    
    	sockaddr_in addr;
    	addr.sin_port = htons( 12345 );
    	addr.sin_addr.s_addr = inet_addr( "127.0.0.1" );
    	addr.sin_family = AF_INET;
    	if ( connect( server,( sockaddr* )&addr, sizeof( addr ) ) == SOCKET_ERROR )
    	{
    		cout << "Fehler: " << WSAGetLastError() << " aufgetreten!" << endl;
    		system( "pause >nul" );
    		WSACleanup();
    		return 0;
    	}
    	cout << "Erfolgreich zum Socket verbunden!" << endl;
    
    	char buf[256];
    	int iBytes = recv( server, buf, 256,0 );
    	cout << "Server sendet: " << iBytes << " Bytes" << endl;
    	buf[iBytes] = '\0';
    	for( int i = 0; i<=iBytes;i++ )
    	{
    		cout << "Server sendet: " << buf[i] << endl;
    	}
    	system( "PAUSE" );
    
    	closesocket( server );
    	WSACleanup();
    
    	return 0;
    }
    

    Später sollte das eine Art Datenbankabfrage übers Netzwerk werden,
    daher die SQLite-Implementierung.

    Leider sendet der Server meinem Klienten nur 0 Bytes,
    demnach nicht den String, den ich versendet habe.

    Woran liegt das?

    €: Da sucht man stundenlang und die Lösung ist vor der Nase,
    der Socket zum Empfangen war der Falsche <.>
    Sry ._.

    Vielen Dank für Eure Hilfe im Voraus 😉


Anmelden zum Antworten