如何使用c ++使用recv()函数接收大数据?

时间:2016-04-03 14:02:30

标签: c++ sockets client httprequest http-get

我正在编写一个使用c ++的控制台应用程序,它使用套接字并向服务器发送 HTTP GET 请求,但响应是一个大于1000000的 html 文件。缓冲区:char buffer[1000000];太小了。 我需要从服务器接收比缓冲区大小更大的数据。

我使用此代码但是获得更大响应的方式是什么?我是这个编程领域的初学者,所以请帮助我完成代码和表达式,谢谢:

char buffer[1000000];


    int nDataLength;
    while ((nDataLength = recv(Socket, buffer, 1000000, 0)) > 0) {
        int i = 0;

        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            myString += buffer[i];
            i += 1;
        }
    }

    cout << myString << "\n"; 

2 个答案:

答案 0 :(得分:2)

从套接字读取时,需要使用较小的固定长度缓冲区,然后在每次循环迭代时将读取数据附加到动态增长的缓冲区(如std :: string或文件)。 recv()告诉你实际读取了多少字节,访问缓冲区时访问的字节数不会超过那么多字节。

char buffer[1024];
std::string myString;

int nDataLength;
while ((nDataLength = recv(Socket, buffer, sizeof(buffer), 0)) > 0) {
    myString.append(buffer, nDataLength);
}

std::cout << myString << "\n"; 

答案 1 :(得分:1)

recv返回值是已接收数据的总大小。 因此,您可以知道总数据大小,如果您的缓冲区小于总数据大小,则有2个解决方案。我猜... 1.在堆上分配缓冲区。使用像new,allcoc等 2.将接收到的数据存储到数据结构(如循环队列,队列),而数据大小为零(recv函数返回)

我更喜欢使用第二种解决方案。 谷歌搜索recv函数,套接字编程示例代码。 那会有所帮助。