c - 分段错误:在套接字编程中收到 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]);
有人可以解释并帮助我解释为什么吗?
解决方案
问题在于函数中的以下行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);
并且不要忘记稍后释放内存。
推荐阅读
- html - 将背景矩形对齐到框的中心和后面
- python - 在 Django 中为每个相同的客户和产品添加数量
- javascript - 使用nodeJS条纹创建付款意图
- python - 从包含区分大小写的单词的段落中删除重复的连续出现的单词/短语
- c - 检测递归函数被另一个函数调用而不是函数本身调用的最佳方法是什么?
- android - Android - 我的应用替换了共享其内容的应用
- android - 如何使 AppBarLayout Drawable 背景分布在状态栏上?
- excel - Excel:未应用条件格式
- maps - 在 Mapbox 中添加监听器 Google 地图
- c# - 在 html actionlink 中使用 Replace