Сравнение строковых данных, полученных из сокета в C - PullRequest
1 голос
/ 07 марта 2009

У меня есть вопрос по сокетам. У меня есть этот код:

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

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

Ответы [ 2 ]

4 голосов
/ 07 марта 2009

Попробуйте:

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

Редактировать, следуя предложению Страгера:

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

if( memcmp( cClientMessage, "Message", strlen( "Message") )) == 0 ) {
   // do something
}
2 голосов
/ 07 марта 2009

Сначала в коде, который вы написали, есть ошибка:

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 == "Message" заключается в том, что если вы сравните char * со строковым литералом или char [] со строковым литералом, то вы будете сравнивать адреса указателей, а не актуальное содержание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...