c++ - 用C++获取网站源码——内容重复

标签 c++

所以,我有这个来源:

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
 
using namespace std;
 
int main (){
        WSADATA wsaData;
 
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
                cout << "WSAStartup failed.\n";
        system("pause");
                return 1;
    }
 
        SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
 
        struct hostent *host;
        host = gethostbyname("www.newegg.com");
 
        SOCKADDR_IN SockAddr;
        SockAddr.sin_port=htons(80);
        SockAddr.sin_family=AF_INET;
        SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
 
        cout << "Connecting...\n";
        if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
                cout << "Could not connect";
                system("pause");
                return 1;
        }
        cout << "Connected.\n";
 
        send(Socket,"GET / HTTP/1.1\r\nHost: www.newegg.com\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.newegg.com\r\nConnection: close\r\n\r\n"),0);
        char buffer[10000];
 
        int nDataLength;
        while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){               
                int i = 0;
                while (buffer[i] || buffer[i] == '\n' || buffer[i] == '\r') {
                        cout << buffer[i];
                        i += 1;
                }
        }
 
        closesocket(Socket);
        WSACleanup();
 
        system("pause");
        return 0;
}

现在,它可以获取源代码,但是之后会不断重复。例如:

注意它是怎么说的,然后继续?我想知道如何避免这种情况。我知道我可以限制缓冲区,但是有更好的解决方案吗?谢谢

最佳答案

尝试改变

    while (buffer[i] || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
    }

    for(; i != nDataLength; ++i)
            cout << buffer[i];

看起来您正在读取缓冲区末尾后的垃圾数据,供 recv 和 friend 使用。没有人说返回的数据必须以 null 终止,这是 while 循环假定的正确行为。

关于c++ - 用C++获取网站源码——内容重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2761605/

相关文章:

c++ - 如何在宏中获取智能指针的类型?

c++ - 仅在 Windows 中的 JsonCpp 模糊重载

c++ - 在Qt中释放文件锁

c++ - 在头文件中将值设置为 "const char *"是否合适

c++ - "default"switch case 是否会影响跳转表优化?

c++ - 如何使用 < 和 > 命令在 C++ 中获取输入和输出?

c++ - winsock bind 无法转换为 int

c++ - openGL 聚光灯问题

c++ - C++ 类函数未处理的异常

c++ - UDT::send 在 for 循环中只发送一次。没有错误