如何在套接字编程(c ++)中读取所有数据?

问题描述 投票:0回答:2

我正在学习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;
            }

        }
    }
c++ network-programming serversocket
2个回答
0
投票

据我所知,您无法确定另一端发送的缓冲区大小。我认为您的方式是应对它的最佳方式,但是您始终可以使用一些技巧。1.确定将作为常量发送的缓冲区大小,这样您每次都可以获取所需的数量。2.我认为是最好的方法:使用自制协议确定发送消息的长度。例如,您可以读取前四个字节以确定消息的大小,然后按给定大小从缓冲区中读取数据。

您可以使用下一个转换:

char* c = new char[4];
recv(sd, c, sizeof(c), 0);
int len = (*(int*)c);
delete[] c;
char* but = new char[len];
recv(sd, but, len, 0);

0
投票

首先,网络不可靠且不可预测,因此我们不知道将接收多少字节,这是设计服务器的起点。

其次,我认为如果您想要一个更高级的服务器,您可能想尝试epoll或IOCP,它们仍然具有循环,但是I / O多路复用性能要好得多。

第三,如果要接受所有数据,则可以尝试构造一个缓冲区。在真实网络中,我们始终使用kafka或其他一些应用来缓冲数据。

© www.soinside.com 2019 - 2024. All rights reserved.