NUL-завершение строки вручную - PullRequest
4 голосов
/ 19 марта 2019

Вот метод на моей стороне сервера:

void send_err(int socket_fd, char *msg) {
    /// To send an error message (`ERR`).

    size_t len = strlen(msg);
    printf("send_err: msg='%s' of size:%zu\n", msg, len);


    INIT_HEAD_S(head_s, ERR, len);
    send_header(socket_fd, &head_s, sizeof(cmd_header_t));
    send_msg(socket_fd, msg, len * sizeof(char));
}

Я вызываю метод следующим образом: send_err(socket_fd, "»»»»»»»»» illogical REQ request.\0");

Сокет настроен правильно, а send_headerи send_args методы работают нормально.

На стороне сервера printf работает просто отлично, но strlen не возвращает правильное значение (должно быть 33, но это даетout 43 вместо).

На стороне клиента полученное сообщение не определено: иногда появляются странные дополнительные символы.По-видимому, добавление \0 вручную, по-видимому, фактически не добавляет NUL-символ в конец моей строки.

Как я должен это сделать? Я хочу, чтобы метод не требовал, чтобы человек считал, сколько символов он отправляет, так как это раздражает.

1 Ответ

4 голосов
/ 19 марта 2019
void send_err(int socket_fd, char *msg) {
    /// To send an error message (`ERR`).

    size_t len = strlen(msg)+1; // because `strlen` doesn't include the NUL char
    printf("send_err: msg='%s' of size:%zu\n", msg, len);


    INIT_HEAD_S(head_s, ERR, len);
    send_header(socket_fd, &head_s, sizeof(cmd_header_t));
    send_msg(socket_fd, msg, len * sizeof(char));
}

Как подсказал Алекс Ф в комментариях, моя ошибка была связана с манипулированием strlen. Мне просто нужно было добавить +1.

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