c - 为客户端收到的消息出现段错误

标签 c sockets segmentation-fault

我正在编写一个简单的客户端-服务器程序。我的服务器收到一条消息并将其打印到标准输出中。

客户端代码:

...
int message_length = strlen(message);
sent_bytes = send(socket, &message_length, sizeof(int), 0);
<... check ...>
sent_bytes = send(socket, message, strlen(message)*sizeof(char), 0);
<... check ...>
...

服务器代码:

...
got_bytes = recv(socket, &message_length, sizeof(int), 0);
<... check ...> 
message = malloc( (message_length+10)*sizeof(char)); 
got_bytes = recv(socket, &message, message_length*sizeof(char), 0);
<... check ...>
printf("Length: %d\n", message_length); 
strcat(message, '\0');
printf("%s\n", message);
...

执行:

$ ./client Message!

$ ./server
Length: 8
Segmentation fault

为什么会发生这种情况?

最佳答案

问题的症结在这里:strcat(message, '\0');

strcat接受两个字符串作为参数,而\0不是字符串,而是字符。此外,如果 message 尚未以 \0 空终止,则 strcat 将失败,因为它将查找 的末尾>消息通过寻找空终止符,以便找出在哪里附加右侧参数。因此,甚至 strcat(message, "") 也不起作用。

可能适合您的解决方案如下:在客户端部分,将 send 部分更改为发送 strlen(message) + 1 字节。假设生成 message 时,message 在客户端以 null 终止符结尾,这将导致 send 操作将 null 终止符发送为好吧,服务器会收到它。然后您可以完全删除 strcat(message, '\0') 代码段。

编辑:您还需要将服务器部分调整为 recv 一个额外字节的 message,以获取空终止符。

关于c - 为客户端收到的消息出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20619346/

相关文章:

objective-c - Corefoundation CFArray 所有权

http - 无论协议(protocol)如何,服务器是否有可能知道 TCP 流具有 "finished"?

java - 将 byte[] 缓冲区重置为零?

纠正此段错误

c - 从 C 文件中读取整数

java - 缓冲区和数据包

无法弄清楚为什么我在初始化数组时遇到段错误

c - 声明变量导致段错误

c - 插入操作中段错误错误

c - 如何使用 TerminateProcess 终止进程