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

时间:2013-12-16 19:34:05

标签: c sockets segmentation-fault

我正在编写一个简单的客户端 - 服务器程序。我的服务器收到一条消息并将其打印到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

为什么会这样?

1 个答案:

答案 0 :(得分:4)

问题的关键在于:strcat(message, '\0');

strcat将两个字符串作为参数,\0不是字符串,而是一个字符。此外,如果message尚未以\0空终止,那么strcat将失败,因为它将通过寻找到message的末尾null终结符,以便找出附加右侧参数的位置。所以,即使strcat(message, "")也行不通。

可能正确的解决方案如下:在客户端部分,更改send部分以发送strlen(message) + 1个字节。假设message在生成message时在客户端获得空终止,这将导致send操作也发送空终止符,并且它将被接收服务器。然后,您可以完全删除strcat(message, '\0')个代码段。

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