Ошибка сегментации: 11 получено при программировании сокета - PullRequest
0 голосов
/ 21 сентября 2018

Привет, я новичок в программировании сокетов. Я пытаюсь получить имя пользователя от моего клиента.В настоящее время в моем файле сервера записан следующий метод:

/* Reads a message from the server socket. */
char *recv_msg(int sockfd)
{

    char *msg;
    /* All messages are 9 bytes. */
    memset(msg, 0, 8);
    int n = read(sockfd, msg, 8);

    if (n < 1 || n >9) /* Not what we were expecting. Server got killed or the other client disconnected. */
        error("ERROR reading message from server socket.");

    return msg;
}

Я вызываю свою функцию следующим образом:

/* Authentication Process */
        write(cli_sockfd[num_conn], "USN", sizeof(int));
        char *username;
        username = recv_msg(cli_sockfd[num_conn]);
        printf("[DEBUG] Client username is %s.\n", username);

Я знаю, что клиент успешно получает сообщение "USN", ноЯ получаю «Ошибка сегментации: 11». Я полагаю, что на username = recv_msg(cli_sockfd[num_conn]); может кто-нибудь объяснить и помочь мне, почему?

1 Ответ

0 голосов
/ 21 сентября 2018

Проблема со следующей строкой в ​​функции char *recv_msg(int sockfd)

 memset(msg, 0, 8);

Прототип функции memset таков:

void *memset(void *s, int c, size_t n);

Функция memset копирует значениеиз c (преобразованного в беззнаковый символ) в каждый из первых n символов объекта, на который указывает s .

В вашем случае msg - это указатель char, которыйне было выделено никакой памяти.

Поэтому вы должны сделать следующее:

 char *msg;
 msg = malloc(8);
 memset(msg, 0, 8);

И не забудьте позже освободить память.

...