首页 > 解决方案 > 分段错误:在套接字编程中收到 11

问题描述

嗨,我是套接字编程的新手,我试图从我的客户那里接收用户名。我目前在我的服务器文件中写入了以下方法:

/* 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]);有人可以解释并帮助我解释为什么吗?

标签: csocketstcpclient-server

解决方案


问题在于函数中的以下行char *recv_msg(int sockfd)

 memset(msg, 0, 8);

的函数原型memset是这样的:

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

memset 函数将 c 的值(转换为无符号字符)复制到 s 指向的对象的前 n 个字符中。

在您的情况下,msg是一个char尚未分配任何内存的指针。

因此,您必须执行以下操作:

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

并且不要忘记稍后释放内存。


推荐阅读