Wie soll ich die Klasse designen?
-
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?
-
stimmt irgendwas mit einbinden nicht???
Kompilieren... main.cpp .\main.cpp(88) : warning C4267: 'Argument': Konvertierung von 'size_t' nach 'int', Datenverlust möglich .\main.cpp(121) : error C2664: 'MessageBoxW': Konvertierung des Parameters 2 von 'const char *' in 'LPCWSTR' nicht möglich Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
-
Ja, ich hab die Zeilen mal vertauscht und es scheint zu klappen :9
@frager: Du musst in den Projekteinstellungen von Unicode auf Multibyte umstellen
Ist das Klassendesign denn für diese AUfgabe in Ordnung? Oder sollte ich noch was ändern? Danke
-
Hi,
ich hab das nun alles erledigt und läuft super
Aber ich hab ein kleines Problem und zwar würde ich gerne auch Texte mit Umlaute fehlerfrei übertragen. Wie mache ich das? Bis jetzt kommt jedesmal ein anderes Zeichen an, wenn ich z.B. ein ä, ö, ü, ß... versenden will
Was kann ich machen? Das wäre mir noch wichtig. Vielen Dank. 