我正在编写一个简单的客户端-服务器程序。我的服务器收到一条消息并将其打印到标准输出中。
客户端代码:
...
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/