Почему функция put не работает с вводом char из сокета в C ++? - PullRequest
0 голосов
/ 12 октября 2011

Это мой код для сервера, на котором запущен менеджер входа в систему, который регистрирует в файле злонамеренный доступ и распечатывает результат неправильного входа в систему. Пользователь chars и pass берутся из пользовательского ввода, используя сокет.

if ((memcmp(user, "admin", strlen("admin")) == 0)) {
    /*code... */
}
else {
    char msg[600];
    strcpy (msg,"Login error with ");
    strcat (msg,"user: ");
    strcat (msg,user);
    strcat (msg," password: ");
    strcat (msg,pass);
    strcat (msg," from: ");
    strcat (msg, client_ip);
    puts (msg);
    logfile->Write(msg);
    return false;
}

Проблема в том, что вывод выводится как на консоль вывода, так и в файл журнала.

Как это:

Login error with user: lol

 password: asd

:��ܔ��P{w� from: 127.0.0.1

Почему там странные символы аски? Как можно избежать новой строки, так как они поступают от пользователя по сокету?

Ответы [ 2 ]

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

Как прокомментировали несколько человек, этот фрагмент кода не содержит ничего специфичного для C ++, поэтому я отвечаю так, как будто вы работаете в простом C.

Я предполагаю, поскольку вы используете memcmpвыше, что ваши входные строки не заканчиваются нулем.strcat будет продолжать добавлять char с того, на что указывает указатель, до тех пор, пока не достигнет '\0'.Вам нужно будет добавить нулевой терминатор, если вы хотите использовать пользователя или пароль в качестве строки в стиле C, или же использовать strncat и передать длину.

Также будьте осторожныобгон msg.Возможно, вам повезет больше, если использовать snprintf для форматирования вашего сообщения, поскольку оно принимает максимальную длину выходной строки.

1 голос
/ 12 октября 2011

Таким образом, вы можете сделать свой код немного меньше

if (strcmp(user, "admin") == 0) {
    /* yahoo, admin! */
}
else {
    char buff[256];
    snprintf(buff, sizeof(buff),
            "Login error with user: %s password: %s from: %s",
            user,
            pass,
            client_ip);
    printf("%s\n", buff);
    logfile->Write(buff);
    return false;
}

добавив этот дополнительный код перед оператором if, вы можете убедиться, что строки верны

printf("user, len:%d, value: %s\n", strlen(user), user);
printf("pass, len:%d, value: %s\n", strlen(pass), pass);
printf("client_ip, len:%d, value: %s\n", strlen(client_ip), client_ip);
...