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

时间:2015-05-01 17:14:13

标签: c sockets recv

晚上好。

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

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

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

这给了我页面的一部分(958-972字节,根据recv()&#39的返回值)。

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

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);
}

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

我该如何正确地做到这一点?

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

但是,对于jxh的观点,您希望使用memcpy代替strcat,并将任何前进指针保留在合并回复中,每次递增received