[英]Segmentation fault with message received for client
我正在编写一个简单的客户端 - 服务器程序。 我的服务器收到一条消息并将其打印到stdout。
客户代码:
...
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
将失败,因为它将通过查找空终止符来寻找 message
的结尾 ,以便找出附加右侧参数的位置。 所以,甚至strcat(message, "")
都不会起作用。
可能正确的解决方案如下:在客户端部分,更改send
部分以发送strlen(message) + 1
个字节。 假设message
在生成message
时在客户端端以空终止,这将导致send
操作也发送空终止符,并且它将由服务器接收。 然后你可以完全摆脱你的strcat(message, '\\0')
片段。
编辑:您还需要调整服务器部分recv
的一个额外的字节message
,让空终止。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.