繁体   English   中英

收到客户端消息的分段错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM