2009-03-07 7 views
1

Ich habe eine Frage zu Sockets. Ich habe diesen Code:Vergleichen String-Daten von einem Socket in C

while(bytes = recv(sClient, cClientMessage, 599, 0)){ 

Damit ist die Nachricht, die er recives in cClientMessage und die Botschaft ist immer "Message". Wie ich eine if-Anweisung wie if(cClientMessage == "Message"){//do func} gemacht habe. Jetzt wird dieser Code nicht die Funktion ausführen, die ich möchte. Ich denke, das liegt daran, dass die Botschaft nicht richtig ankommt. Kann mir jemand helfen?

+0

Keine Ahnung, warum dies abgelehnt wurde .. –

+0

Die akzeptierte Lösung hat einige Bugs drin, und auch hier sind einige Fehler, die nicht erwähnt werden t erscheint in der ursprünglichen Frage. Bitte sehen Sie meine Lösung unten. (Beispiel: Wenn Sie "Message5" erhalten, wird es ein Match sein, sogar wissen, dass es nicht sein sollte). –

Antwort

4

Versuchen:

if(strcmp(cClientMessage, "Message")) == 0) { 
    // do something 
} 

Bearbeiten von strager folgenden Vorschlag:

Eine bessere Lösung, die auf die empfangenen Daten hängt nicht null beendet wird, ist memcmp zu verwenden:

if(memcmp(cClientMessage, "Message", strlen("Message"))) == 0) { 
    // do something 
} 
+0

Ich denke mehr memcpy, wenn das \ 0 nicht vorhanden ist, aber ich denke, das kann funktionieren. – strager

+0

(Ich frage mich, wer -1'd das ...) – strager

+0

memcmp, eher als memcpy denke ich? –

2

Zuerst gibt es einen Fehler in dem Code, den Sie schrieb:

while(bytes = recv(sClient, cClientMessage, 599, 0)){ 

Das ist falsch, weil recv wird nicht Null zurück, wenn es einen Fehler Buchse ist und der Code wird zu einer Endlosschleife führen. Insbesondere möchten Sie> 0

char cClientMessage[599]; 
while((bytes = recv(sClient, cClientMessage, sizeof(cClientMessage), 0)) > 0) 
{ 
    if(strlen("Message") == bytes && !strncmp("Message", cClientMessage, bytes)) 
    { 
    //cClientMesssage contains "Message" 
    } 
} 

if(bytes == 0) 
{ 
    //socket was gracefully closed 
} 
else if(bytes < 0) 
{ 
    //socket error occurred 
} 

Das Problem mit überprüfen, was Sie getan haben: cClientMessage == „Nachricht“ ist, dass, wenn Sie vergleichen, um ein char * zu einem String-Literal oder ein char [] in einen String Literal, dann werden Sie die Zeigeradressen und nicht den tatsächlichen Inhalt vergleichen.

+0

Das Memset ist verschwenderisch. Sag einfach cClientMessage [Bytes] = 0; Je nach den zu empfangenden Parametern liegen die Bytes immer zwischen 0 und 598. – jmucchiello

+0

Sie sollten strncmp anstelle von strcmp verwenden. Außerdem überprüfen Sie nicht, ob die Nachricht kürzer als 8 Zeichen ist - Sie erhalten möglicherweise falsche positive Ergebnisse, wenn Sie beispielsweise die 4-Byte-Meldung "Mess" erhalten haben und Ihr Puffer bereits den Kopf "... age \ 0" enthält. –

+0

Danke adam ich kümmerte mich auch darum –