Wie soll ich die Klasse designen?



  • 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. 👍


Anmelden zum Antworten