Как прочитать вход от клиента через сокет в Linux в C ++? - PullRequest
1 голос
/ 09 октября 2011

Моя цель - создать клиентский сервер приложений, написанный на C ++.Когда сервер читает входные данные от клиента, он должен обработать строку и выдать вывод.По сути, у меня есть просто эхо-сервер, который отправляет одно и то же сообщение.Но если пользователь вводит специальную строку (например, «выход»), программа должна сделать что-то еще.Моя проблема в том, что это не происходит, потому что сравнение между строками не работает ... Я не знаю, почему!Вот простой код:

  while(1) {
            int num = recv(client,buffer,BUFSIZE,0);
            if (num < 1) break;
            send(client, ">> ", 3, 0);
            send(client, buffer, num, 0);

            char hello[6] ="hello";
            if(strcmp(hello,buffer)==0) {
                send(client, "hello dude! ", 12, 0);
            }

            buffer[num] = '\0';
            if (buffer[num-1] == '\n')
                buffer[num-1] = '\0';
            std::cout << buffer;
            strcpy(buffer, "");
        }

Почему сравнение не работает?Я пробовал много решений ... но все не удалось: (

Ответы [ 3 ]

2 голосов
/ 09 октября 2011

Ваши данные в buf могут не заканчиваться NULL, потому что buf содержит случайные данные, если они не инициализированы.Вы знаете только содержимое первых num байтов.Поэтому вы также должны проверить, сколько данных вы получили, прежде чем сравнивать строки:

const char hello[6] ="hello";
size_t hello_sz = sizeof hello - 1;
if(num == hello_sz && memcmp(hello, buffer, hello_sz) == 0) { ...

В качестве примечания, этот протокол будет хрупким, если вы не разграничите свои сообщения, поэтому в случае фрагментированных чтений(получить «hel» при первом чтении, «lo» при втором) вы можете сказать, где начинается одно сообщение, а другое заканчивается.

0 голосов
/ 09 октября 2011

A string определяется как массив из char s, включая завершающий байт \0.Изначально ваш buffer содержит произвольные байты, и даже не обязательно содержит строку.Вы должны установить buffer[num] = '\0', чтобы сделать его строкой.

Это, конечно, означает, что recv не должен читать sizeof buffer байтов, но на один байт меньше.

0 голосов
/ 09 октября 2011

strcmp требует строки с нулевым символом в конце.Буфер, в который вы читаете, может иметь ненулевые символы после полученного сообщения.

Либо непосредственно перед чтением, выполните:

ZeroMemory(buffer, BUFSIZE); //or your compiler defined equivalent

Или сразу после чтения

buffer[num] = '\0';

Это обеспечит завершение нулем в конце полученного сообщения и сравнение должно сработать.

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