P
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