Wie soll ich die Klasse designen?
-
Hallo,
ich möchte gerne eine Klasse schreiben die es ermöglich zwischen einem Client und einem Server Daten auszustauschen. In diesem Fall geht es um den Client
Jedenfalls müsste ich der Klasse "Client" genügend Funktionen zur Verfügung stellen damit ich diese später nutzen kann. Wichtig ist hierbei das die Klasse Client so programmiert wird, dass sie keinen Thread braucht sondern in meinem schon laufenden eingesetzt werden kann. Desweiteren, soll der Client bei einem gescheiterten Verbindungsaufbau erneut versuchen eine Verbindung aufzubauen.while ( true ) { // ... if ( !Client->isConnected() ) { Client->Connect( "127.0.0.1", 1234 ) } else { MessageBox( NULL, Client->Recieve().c_str(), "Debug", NULL ); Client->Send( "Test :-)" ); } //... }Wie würdet ihr die Klasse aufbauen? Ich hoffe meine Frage ist verständlich

Ich muss das jedenfalls in eine Klasse packen, da ich diese noch an eine Funktion weitergeben muss.
Vielen Dank im Voraus
-
hast doch schon die methoden aufgeschrieben die du brauchst. was sit das problem?
-
Dein Problem ist hier tatsächlich nicht ersichtlich.
Was soll der Client leisten? Je nach Leistung des Clients, ist das Problem (welches hier eh nicht ersichtlich ist) auf mehreren bzw unterschiedlichen Wegen zu lösen.Gruß
-
Folgendes Stück Code funktioniert z.B. nicht
char *Client::Receive() { char buf[512]; long rc = recv( s, buf, strlen( buf ), 0 ); buf[rc] = '\0'; if(rc==0 || rc == SOCKET_ERROR) { connected = false; closesocket( s ); } return buf; // Stack around the variable 'buf' was corrupted....... }Wie mache ich es richtig bzw. wie würdet ihr es machen. Danke

Gruß
-
öhm ja ... die Variable buf existiert nachm verlassen der Methode nicht mehr. D.h. => Zeiger auf nix.
-
das hat aber nix mit klassendesign zu tun
-
Klappt auch nicht:
std::string Client::Receive() { char buf[512]; long rc = recv( s, buf, strlen( buf ), 0 ); buf[rc] = '\0'; if(rc==0 || rc == SOCKET_ERROR) { connected = false; closesocket( s ); } std::string Temp = buf; return Temp; }Also????
-
while ( true ) { // ... if ( !Client->isConnected() ) { Client->Connect( "127.0.0.1", 1234 ) } else { MessageBox( NULL, Client->Recieve().c_str(), "Debug", NULL ); Client->Send( "Test :-)" ); } //... }Das soll einfach möglich sein!!! Aber das kriege ich nicht, also scheiterts doch am Klassendesign...

-
sizeof(buf) statt strlen(buf)
-
blödsinn geschrieben, einfach ignorieren ^^
-
Hab das nun alles ausprobiert, aber irgendwo knallts trotz allem noch immer

class Client { private: char buf[512]; SOCKET s; SOCKADDR_IN addr; long rc; bool connected; public: Client(); ~Client(); public: bool Init( const std::string& IP, int Port ); std::string Receive(); void Send( const std::string& Str ); bool isConnected(); private: int startWinsock(); };Client::Client() : connected( false ) { rc = startWinsock(); } Client::~Client() { if ( s ) { closesocket( s ); } WSACleanup(); } bool Client::Init( const std::string& IP, int Port ) { s = socket( AF_INET, SOCK_STREAM, 0 ); if ( s == INVALID_SOCKET ) { connected = false; return false; } // Verbinden memset( &addr, 0, sizeof( SOCKADDR_IN ) ); addr.sin_family = AF_INET; addr.sin_port = htons( Port ); addr.sin_addr.s_addr = inet_addr( IP.c_str() ); if ( connect( s, (SOCKADDR*)&addr, sizeof( SOCKADDR ) ) == SOCKET_ERROR ) { connected = false; return false; } connected = true; return true; } std::string Client::Receive() { long rc = recv( s, buf, sizeof( buf ), 0 ); buf[rc] = '\0'; if(rc==0 || rc == SOCKET_ERROR) { connected = false; closesocket( s ); } return buf; } void Client::Send( const std::string& Str ) { if ( s ) { rc = send(s,Str.c_str(),Str.length() + 1,0); } } bool Client::isConnected() { return connected; } int Client::startWinsock() { WSADATA wsa; return WSAStartup( MAKEWORD( 2, 0 ), &wsa ); }while ( true ) { // ... if ( !Client->isConnected() ) { Client->Init( "127.0.0.1", 1234 ) } else { MessageBox( NULL, Client->Recieve().c_str(), "Debug", NULL ); Client->Send( "Test :-)" ); } //... }Irgendwas mit Heap kaputt... Der Fehler muss jedoch DEFINITIV in diesen Zeilen stecken... Was mache ich falsch? Vielen dank im Voraus...
Ja ich weiß, ist nicht sooo wenig Code, aber irgendwie komme ich nicht weiter und ich würde das gerne so gut wie möglich lösen und dabei könnt ihr mir natürlich am Besten helfen
Danke!Gruß
-
hmm
int Client::recv(void* buf, const int& len) { if (connected == false) return -1; return (::recv(s, reinterpret_cast<char*>(buf), len, 0)); }wo ist das Problem?
-
lad mal das ganze projekt hoch, ich debugge es dir dann
-
Ganze Projekt?
#include <winsock.h> #include <string> #include <iostream> #pragma comment( lib, "ws2_32.lib" ) class Client { private: char buf[512]; SOCKET s; SOCKADDR_IN addr; long rc; bool connected; public: Client(); ~Client(); public: bool Init( const std::string& IP, int Port ); std::string Receive(); void Send( const std::string& Str ); bool isConnected(); private: int startWinsock(); }; //------------------------ Client::Client() : connected( false ) { rc = startWinsock(); } Client::~Client() { if ( s ) { closesocket( s ); } WSACleanup(); } bool Client::Init( const std::string& IP, int Port ) { s = socket( AF_INET, SOCK_STREAM, 0 ); if ( s == INVALID_SOCKET ) { connected = false; return false; } // Verbinden memset( &addr, 0, sizeof( SOCKADDR_IN ) ); addr.sin_family = AF_INET; addr.sin_port = htons( Port ); addr.sin_addr.s_addr = inet_addr( IP.c_str() ); if ( connect( s, (SOCKADDR*)&addr, sizeof( SOCKADDR ) ) == SOCKET_ERROR ) { connected = false; return false; } connected = true; return true; } std::string Client::Receive() { long rc = recv( s, buf, sizeof( buf ), 0 ); buf[rc] = '\0'; if(rc==0 || rc == SOCKET_ERROR) { connected = false; closesocket( s ); } return buf; } void Client::Send( const std::string& Str ) { if ( s ) { rc = send(s,Str.c_str(),Str.length() + 1,0); } } bool Client::isConnected() { return connected; } int Client::startWinsock() { WSADATA wsa; return WSAStartup( MAKEWORD( 2, 0 ), &wsa ); } int main () { std::cout << "Hmm" << std::endl; Client * BlubClient = new Client; while ( true ) { // ... if ( !BlubClient->isConnected() ) { BlubClient->Init( "127.0.0.1", 1234 ); } else { std::cout << "VERBUNDEN!" << std::endl; MessageBox( NULL, BlubClient->Receive().c_str(), "Debug", NULL ); BlubClient->Send( "Test :-)" ); } //... } delete BlubClient; }Was nicht funktioniert? Er sendet die Nachricht "Test :-)" nicht und sobald der Server beendet wird gibt er eine Messagebox mit Schrott aus und das jedesmal aufs neue! Das soll so nicht sein. Und überhaupt ist die Klasse für dieses vorhaben in Ordnung?
Als Server könnt ihr diesen nehmen: http://www.c-worker.ch/tuts/socksrv.c
-
Auf den Port aufpassen! Der ist hier unterschiedlich den müsstet ihr als einzigstes anpassen...
-
Erst senden, dann empfangen, von alleine sendet der Server ja nichts.
-
proggingm@nia schrieb:
Erst senden, dann empfangen, von alleine sendet der Server ja nichts.
Na sowas aber auch, echt nicht ? Ist wohl kein auto-Server oder wie ?
-
was ist #pragma? Warum steht das nicht in C++ Anwenden und professionell anwenden? Was ist das?
-
wenn der code funktioniert, kannst du das nochmal hier kopieren? ich will das auch compilieren!
-
@frager: in Zeile 115 den Port auf 12345 setzen und Zeile 120 und 121 vertauschen.
-
warum hacker-port?
die beiden
MessageBox( NULL, BlubClient->Receive().c_str(), "Debug", NULL ); BlubClient->Send( "Test :-)" );tauschen? hat der threadersteller das schon getestet?