c сравнительными проблемами - PullRequest
1 голос
/ 26 ноября 2010

Код сервера для обработки полученных данных:

while (1)
{
    /* RECEIVE DATA */
    bytes_recieved = recv(connected,recv_data,1024,0);
    recv_data[bytes_recieved];

    if (strcmp(recv_data , "q") == 0 || strcmp(recv_data , "Q") == 0) {
        send(connected, "disconnected",strlen("disconnected"), 0); 
        fflush(stdout);
        close(connected);
        break;

    } else if(strcmp(recv_data , "lala") == 0) {
        printf("\n RECIEVED DATA = %s " , recv_data);
        send(connected, "showMe",strlen("showMe"), 0);  
        fflush(stdout);

    } else {
        printf("\n RECIEVED DATA = %s " , recv_data);
        send(connected, "Could not find",strlen("Could not find"), 0);  
        fflush(stdout);
    }
    fflush(stdout);

}

Код клиента для отправки данных:

// Sending
printf("Please enter the message: ");
fgets(send_data,1024,stdin); // send_data is the string -> char send_data[1024]

// Receive
bytes_recieved=recv(sock,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';
printf("\nRecieved data = %s " , recv_data);

Но мой результат всегда:

Could not find

Даже если я отправил (от клиента): q или Q или lala

Я проверил сайт Cplusplus, я уверен, strcmp вернет 0, когда 2 строки совпадают Кто-нибудь может помочь, почему он всегда возвращает сообщение «Не удалось найти»?

РЕДАКТИРОВАТЬ => Фредерик:

после добавления:

printf("recv_data: \"%s\"\n", recv_data)

От клиента, которого я отправил: lala

Результат:

recv_data: "lala
"

Другая двойная кавычка во второй строке

Ответы [ 3 ]

0 голосов
/ 26 ноября 2010

Функция recv () только записывает байты в вашу строку, она не добавляет терминатор нулевого символа , необходимый для правильного завершения. Похоже, вы пытались сделать это самостоятельно:

/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved];

Но это должно быть:

/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
recv_data[bytes_recieved] = '\0';

РЕДАКТИРОВАТЬ: Строка, которую вы отправляете, заканчивается символом новой строки. Возможно, вам нужно удалить его в коде вашего сервера:

/* RECEIVE DATA */
bytes_recieved = recv(connected,recv_data,1024,0);
if (bytes_recieved > 0 && recv_data[bytes_recieved - 1] == '\n') {
    --bytes_recieved;  // Overwrite the newline with the null terminator.
}
recv_data[bytes_recieved] = '\0';
0 голосов
/ 26 ноября 2010

Мне кажется, что выражение

recv_data[bytes_recieved]; 

должно быть

recv_data[bytes_recieved] = '\0'; 

Это обеспечит завершение буфера нулевым значением и будет работать для сравнения строк

0 голосов
/ 26 ноября 2010

Похоже, что вы используете строки C, в этом случае:

if(recv_data == "q" || recv_data == "Q")

должно быть:

if(recv_data[0] == 'q' || recv_data[0] == 'Q')

также нет никаких проверок, чтобы увидеть, что вы действительно получаете некоторые данные (или если была ошибка сокета!), А также буфер очистки не очищен (использование memset или обнуление последнего + 1 символа после его заполнения) перед его использованием, что может привести к проблемам.

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