【发布时间】:2020-05-12 12:40:46
【问题描述】:
我正在学习 C++ 中的套接字编程。我已经通过缓冲区值初始化为 10。我使用 select() 函数来监视套接字。当客户端发送的数据大于我的缓冲区可以容纳的数据时,它将读取缓冲区大小的数据,并再次遍历我的所有客户端并读取剩余的数据。如何一次读取所有数据而无需再次通过循环解析读取剩余数据?
感谢您的帮助。
for(i = 0;i < max_clients; i++){
sd = clients_list[i];
if(FD_ISSET(sd,&temp)){
char buf[10];
int n = recv(sd, buf, sizeof(buf),0);
if(n == -1){
perror("recv");
}else if(n == 0){
cout << "Client is GONE " << endl;
close(sd);
clients_list[i] = 0;
}
else{
buf[n] = '\0';
cout << "From the node: " << buf << endl;
}
}
}
【问题讨论】:
-
您好,无法理解您的问题。循环所有客户端并读取所有缓冲区直到传输所有数据是正常过程。您可以扩大缓冲区以获取每个块的更多数据,但仍会循环。也许如果这不能回答您的问题 - 请更新您的问题以更准确。
-
嗨。如果我要读取超过 10 个字节的数据,它将读取这 10 个字节,将其打印出来并返回并通过 for 循环解析,即通过所有 FD_SET 并再次检查某些 I/O 并打印剩余数据。有没有一种方法可以一次读取所有数据而无需一次又一次地通过 for 循环并检查该套接字的某些 I/O。我希望这可以解决这个问题。 @TomFreudenberg
-
@thevortex_17
recv()不能保证一次性接收所有请求的字节,所以无论如何你都需要一个循环。发送方可以在发送缓冲区内容之前发送缓冲区大小,然后接收方将知道预期的字节数,然后它可以继续读取直到实际到达的字节数,无论它需要多少recv()调用。跨度> -
@thevortex_17 也许你可以只改变循环。而是循环所有客户端并只读取一个块,您可能会保留并循环直到当前客户端的数据不再可用。这是你喜欢的吗?