c - 段错误: 11 received in socket programming

标签 c sockets tcp client-server

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

/* 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 *recv_msg(int sockfd)

中的以下行
 memset(msg, 0, 8);

memset的函数原型(prototype)是这样的:

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

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

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

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

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

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

关于c - 段错误: 11 received in socket programming,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52434732/

相关文章:

java - 在java中获取固定数量的TCP数据包

security - 利用 "backwards"进入出站 tcp 连接的风险

c - 为什么这个程序的行为类似于 `tail -f`

c - 如何使用带有 char 条件的 if 语句将 int 值插入矩阵?

c - 如何在我的 C 源代码中包含命令 "wget"?

更改dll的内容

sockets - Skype和所有其他p2p程序如何工作而不被阻止?

sockets - TCP 套接字上的长连接

c - UDP recvfrom查询

.net - VB6 WinSock TCP 客户端和 .NET TCP 服务器