Problem bei Anwendung von Vergleichsoperatoren auf eine Variable



  • Hi,
    ich brauche mal Eure Hilfe.
    Wahrscheinlich übersehe ich nur eine Kleinigkeit, aber genau diese finde ich nicht. Ich habe ein kleines Gerüst für einen Client und einen Server und der Server macht mir Probleme. Das Gerüst ist eigentlich nur der Anfang und das Programm soll später etwas Komplexer werden. Der Socket Funktioniert wie er soll, eine Zeichenkette wird vom Client an den Server geschickt und da auch ausgegeben. Nun will ich aber später noch Sachen Einbauen die vom Inhalt der übertragenen Zeichen abhängig sind. Nun habe ich eine if Anweisung zu meine Variablen msg eingebaut um erst mal zu testen. Aber genau das funktioniert nicht. Die Ausgabe von msg geht, aber nicht die Anwendung von Vergleichsoperatoren auf diese Variable. Kann mir jemand einen Hinweis geben, warum mein Code nicht funktioniert?
    Ich vermute mal, dass ich irgendwo einen Denkfehler habe. Das ich mal C gelernt habe, ist schon verdammt lange her.
    Ich setze hier mal nur die betreffende Schleife als Codeschnipsel rein, denn der Rest funktioniert ja.

    while(true)
    		{
    			int len = sizeof(server);
    			s = accept(s, (sockaddr*)&server, &len);
    
    			int size;
    			char msg[1025];
    
    			while((size = recv(s, msg, 1024, 0)) > 0)
    
    			{
    				size = recv(s, msg, 1024, 0);		
    				// Genau dieser Teil macht Probleme
    				if (msg == "Hallo")cout << msg << endl;
    				if (msg == "b")cout << "OK" << endl;
    				// ab hier läuft es wieder wie es soll
    				cout << msg; cout << endl;
    				memset(msg, 0, 1025);
    
    			}
                   	}
    


  • Oh man.. da sag mir noch mal jemand, man soll C++ vor C lernen.
    Du vergleichst hier nur Adressen, zwei Pointer. Nutze entweder strcmp() oder wandle das vorher in einen std::string um:

    if (std::strcmp(msg, "Hallo") == 0)
      ..
    if (std::string(msg) == "Hallo")
      ..
    

    (Du solltest dir am besten eine Socket Klasse machen, die den LowLevel Kram für die regelt.)

    Edit: Und du empfängst zwei mal in der Schleife? Das scheint nicht gewollt zu sein.



  • Oh, das ging aber schnell! Ich danke Dir. Ja klar, da lag mein Denkfehler. Zwei Pointer zu vergleichen kann ja so auch nicht klappen.
    Wie gesagt, dass ich mal C lernen musste, ist ein halbes Leben her. Da sind viele Dinge in Vergessenheit geraten.
    Das mit dem doppelten Empfang ist wirklich nicht gewollt. Da hatte ich was getestet und vergessen die eine Zeile auszukommentieren.
    Ich glaube nun bin ich meinem Ziel etwas näher.
    Danke!

    PS: Super, genau das war die Lösung!
    Ich habe

    std::string(msg)
    

    verwendet und nun macht er genau was ich will.



  • Mir ist noch aufgefallen, dass der erste Durchlauf deiner Schleife undefiniertes Verhalten erzeugt. Der String muss nullterminiert sein, das memset machst du aber am Ende der Schleife. Hier mal ein Beispiel für eine einfachere Empfangsschleife:

    char buf[0x1000];
    int rval;
    while ((rval = recv(sock, buf, sizeof(buf) - 1, 0)) > 0)
    {
      buf[rval] = '\0'; // Sicher nullterminieren
      ...
    }
    if (rval == -1) // Fehler. Bei 0 wurde die Verbindung getrennt.
    {
    }
    


  • Oh, ja danke, ich werde es umsetzen. Ich lerne immer gern dazu.


Log in to reply