我正在编写一个简单的客户端 - 服务器程序。我的服务器收到一条消息并将其打印到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
为什么会这样?
答案 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
的一个额外字节,以获得空终止符。