2009-03-07 2 views
1

У меня вопрос о сокетах. У меня есть этот код:Сравнение строковых данных, полученных от сокета в C

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

Это помещает сообщение он recives в cClientMessage и сообщение всегда «Сообщение». Как я сделал заявление if, как if(cClientMessage == "Message"){//do func}. Теперь этот код не будет выполнять функцию, которую я хочу. Я думаю, это потому, что оно не получает сообщение правильно. Кто-нибудь может мне помочь?

+0

Не знаю, почему это было отклонено .. –

+0

В принятом решении есть некоторые ошибки, а также есть некоторые ошибки, не упомянутые tha t появляется в исходном вопросе. См. Мое решение ниже. (Пример: если вы получите «Message5», это будет матч, даже знаю, что этого не должно быть). –

ответ

4

Try:

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

Edit, следуя предложению от strager:

Лучшее решение, которое не зависит от полученные данные, оканчивающихся нулем является использование memcmp:

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

Я думаю больше memcpy, если \ 0 нет, но я думаю, это может сработать. – strager

+0

(Интересно, кто это сделал?) – strager

+0

memcmp, а не memcpy Я думаю? – 2009-03-07 01:21:31

2

Во-первых есть ошибка в коде Вы писали:

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

Это неправильно, потому что RECV вернет не ноль, если есть ошибка сокета и ваш код приведет к бесконечному циклу. В частности, вы хотите проверить> 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 
} 

Проблема с тем, что вы сделали: cClientMessage == «Сообщение» является то, что если сравнить символ * в строку буквальным, или символ [] в строку literal, тогда вы будете сравнивать адреса указателей, а не фактическое содержимое.

+0

Меморандум расточительно. Просто скажите cClientMessage [bytes] = 0; байты всегда будут находиться в диапазоне от 0 до 598 на основе параметров для recv. – jmucchiello

+0

Вы должны использовать strncmp вместо strcmp. Кроме того, вы не проверяете, является ли сообщение короче 8 символов - вы можете получить ложные срабатывания, если вы получили 4 байта «Mess», например, и ваш буфер уже возглавляет «... age \ 0» в нем. –

+0

Спасибо adam, я тоже позаботился об этом –