[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
