晚上好。
我试图通过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);
}
但是这给了我大页面上的分段错误(在超过分配给回复的大小之前),并且在小页面上,导致回复包含几次页面内容。
我该如何正确地做到这一点?
答案 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
。