读取除最后一个缓冲区外的所有缓冲区(在C中)
我想从管道中读取除最后一个缓冲区之外的所有缓冲区。这是我当前的代码:读取除最后一个缓冲区外的所有缓冲区(在C中),c,C,我想从管道中读取除最后一个缓冲区之外的所有缓冲区。这是我当前的代码: while(read(server_to_client,serverString2,sizeof(serverString2))){ printf("Client : PID %d",getpid()); printf("-Target>>%s<<", clientString2); printf(serverString2); } while(读取(服务器到客户端,服务器字符串2,
while(read(server_to_client,serverString2,sizeof(serverString2))){
printf("Client : PID %d",getpid());
printf("-Target>>%s<<", clientString2);
printf(serverString2);
}
while(读取(服务器到客户端,服务器字符串2,大小为(服务器字符串2))){
printf(“客户端:PID%d”,getpid());
printf(“-Target>%s您真的需要避免读取最后一个缓冲区吗?还是仅仅避免对它做任何事情?可能是不同形式的循环?可能是在读取每个缓冲区后检查eof()
while(read(server_to_client,serverString2,sizeof(serverString2)))
{
if (! eof(server_to_client))
{
printf("Client : PID %d",getpid());
printf("-Target>>%s<<", clientString2);
printf(serverString2);
}
else
{
// do special stuff for the last buffer here
}
}
while(读取(服务器到客户端,服务器字符串2,大小为(服务器字符串2)))
{
如果(!eof(服务器到客户端))
{
printf(“客户端:PID%d”,getpid());
printf(“-Target>>%s你不能。这个问题根本没有意义
问题假设“缓冲区”是数据的一个有意义的度量单位,但事实并非如此。特别是的第三个参数read(2)是要读取的最大字节数,但由于大量原因,调用实际传输的字节数可能会减少,到达数据末尾的字节数只有一个。实际上,当要读取的文件描述符连接到管道(如您所说)时,其他原因比连接到文件时更可能出现。请注意这意味着如果要检查read()
读取的数据,必须始终捕获其返回值,否则无法知道缓冲区中有多少包含有效数据
更一般地说,您无法从管道的打开文件描述符中判断有多少数据可从中读取。您需要在协议中包含该信息(例如,HTTP的内容长度
标头),或以某种方式进行带外通信。这仍然不能告诉您现在有多少数据可供读取,但它可以帮助您确定何时停止尝试读取更多数据
编辑以添加:
如果你问是因为你想避免处理部分填充的缓冲区,那么你就没有运气了。至少,当数据被过早截断时,你需要为部分填充的缓冲区做好准备。除非要传输的数据的总大小一定是所选缓冲区大小的倍数,否则你也必须这样做准备在数据末尾处理一个部分缓冲区。但是,您可以避免重复使用“代码>> Read())/代码> ING处理数据中间的部分缓冲区,直到填充缓冲区,可能通过包装函式,例如:
ssize_t read_fully(int fd, void *buf, size_t count) {
char *byte_buf = buf;
ssize_t bytes_remaining = count;
while (1) {
ssize_t nread = read(fd, byte_buf, bytes_remaining);
if ((nread <= 0) || ((bytes_remaining -= nread) <= 0)) {
break;
}
byte_buf += nread;
bytes_remaining -= nread;
}
return count - bytes_remaining;
}
ssize\u t read\u完全读取(int fd,void*buf,size\u t count){
char*byte_buf=buf;
剩余字节数=计数;
而(1){
ssize\u t nread=读取(fd,字节,剩余字节);
如果((nread)那么您的软件如何识别“最后一个”缓冲区?软件只是在循环中读取服务器端的所有缓冲区,而不是逐个读取。它不识别任何其他printf(serverString2);
是一个非常坏的习惯。如果字符串中有%
怎么办?如果缓冲区后面没有NUL字符怎么办?注意read()
可以返回-1,这不会导致循环退出。我在服务器端处理所有检查。我只是在使用客户端打印结果。如何避免处理最后一个缓冲区?C提供了一套灵活的条件语句。可以使用其中任何一个来避免处理最后一个缓冲区(同样的方法)前提是您可以解决识别最后一个的关键问题(可能在阅读后)。如果您既不知道带外数据,也不知道协议中的某项数据的预期时间,则在到达终点之前,您无法知道即将到达该数据。如果必须了解这一点,则最好将整个传输缓存在内存或磁盘中,以计算其大小,然后对其进行处理我需要以不同的方式打印最后一个缓冲区。我只想让最后一个缓冲区产生不同的结果,所以,在我添加的if子句后面加一个else(nvm,我为您更新了答案)