【问题标题】:Segmentation fault: 11 received in socket programming分段错误:在套接字编程中收到 11
【发布时间】:2019-02-25 07:59:01
【问题描述】:

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

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

【问题讨论】:

  • 介于char *msg;memset(msg, 0, 8); 之间的某个位置,最好将msg 变量设置为指向至少八个字节。请张贴minimal reproducible example

标签: c sockets tcp client-server


【解决方案1】:

问题在于函数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);

别忘了稍后释放内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2020-12-27
    • 1970-01-01
    • 2018-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多