使用 C:recv() 下载整个网页

Downloading an entire webpage with C: recv()

晚上好。

我正在尝试通过 C 应用程序获取网页的全部内容(图像除外)。

连接到所需的 URL 后,我使用 recv(),如下所示:

char *reply;
reply==malloc(10000*sizeof(char));
recv(socketname, reply, 10000, 0);

这给了我页面的一部分(958-972 字节,根据 recv() 的 return 值)。

所以,我尝试将其修改为:

ssize_t received=0;
char *reply, *buffer;
reply=malloc(10000*sizeof(char));
buffer=malloc(255*sizeof(char));
while(received<10000) {
     received+=recv(socketname, buffer, 10000, 0);
     strcat(reply, buffer);
}

但这在大页面上(在超过分配给回复的大小之前)给我一个分段错误,在小页面上,导致回复包含页面内容的几倍。

如何正确执行此操作?

buffer=malloc(255*sizeof(char)); 只给你 255 个字节。

recv(socketname, buffer, 10000, 0); 尝试阅读更多内容。

这就是为什么会出现段错误。

另外,你不知道自己下载的是什么,所以你最好memcpy复制。

一个未经测试的例子:

ssize_t received=0, current_received=0;
char *reply, *buffer;
reply=malloc(10000*sizeof(char));
buffer=malloc(255*sizeof(char));
while(received<10000) {
     current_received = recv(socketname, buffer, 255, 0);
     if(current_received <= 0) {
         //if we're done or we have an error. Think about some error handling.
         break;
     }
     //I have switched the following lines to make it a bit easier.
     //As an exercise try to avoid overflow if received=9999 and current_received=255 :)
     memcpy(reply + received, buffer, current_received);
     received += current_received;
}

如果您正在寻找可以为您完成的图书馆,请查看 this link

请记住,如果您只想要一个非常简单的示例,那么使用库实际上可能会非常困难。

但就 jxh 而言,您希望使用 memcpy 而不是 strcat,并将任何前进指针保留到您的合并回复中,每次递增 received