【发布时间】:2021-12-26 01:24:39
【问题描述】:
所以编写了一个客户端,它只接收缓冲区中的字符,然后我打印出来:
//CODE FROM BJ'S GUIDE TO NETWORK PROGRAMMING *1
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("%s",buf);
//MY CODE
while (numbytes > 0) {
numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0);
if (numbytes > 0) {
buf[numbytes] = '\0';
printf("\%s",buf);
}
}
buf 是一个 char[512] 数组
我还想 recv() "\0" 和 "\n" 并将它们打印为 "\0" 和 "\n"
代码如下所示
printf("this contains a \\n byte and a \\0 byte");
我无法更改服务器端的内容,因为我必须编辑接收端
【问题讨论】:
-
如果缓冲区可以包含多个
\0字节,则它不是字符串,不能只使用字符串函数。您必须将其视为内存缓冲区并使用numbytes变量对其进行处理。一种方法是一次只读取一个字符,并尽可能按字面输出该字符,或根据需要转义。 -
您可以使用
memchr()来查找'\0'值字节。 -
recv不会为您提供以空字符结尾的字符串。它为您提供一个字节缓冲区和一个单独的计数,告诉您有多少字节。因为它不是一个字符串,所以你不能用普通的 C 字符串处理函数来打印它,比如printf%s。您可以使用fwrite(buf, 1, numbytes, stdout);将其打印到屏幕上。 -
在您的上下文中,“numbytes”在进入循环之前未分配任何值。如果它最初大于 0 怎么办?为什么不像 Beej 那样在 while () 表达式中插入 recv()?而且 recv() 也不会返回上面提到的字符串。您不应将最后收到的字节替换为 '\0'。
-
while ((numbytes = recv(sockfd, buf, MAXDATASIZE, 0) > 0) {
标签: c network-programming printf