memset(buf, 0, sizeof(buf));
int htmlstart = 0;
char * htmlcontent;
char *mainpage = (char *) malloc(MAXBUF);
while((tmpres = recv(sock, buf, MAXBUF, 0)) > 0)
{
if(htmlstart == 0) //on first run, ignore headers
{
htmlcontent = strstr(buf, "\r\n\r\n");
if(htmlcontent != NULL)
{
htmlstart = 1;
htmlcontent += 4;
}
}
else
{
htmlcontent = buf;
}
if(htmlstart)
{
mainpage = (char *) realloc( mainpage, (strlen(mainpage) + strlen(htmlcontent) + 1) );
// printf("%s",htmlcontent);
strcat(mainpage,htmlcontent);
}
memset(buf, 0, tmpres);
}
if(tmpres < 0)
{
perror("Error receiving data");
}
printf("%d",(int)strlen(mainpage));
我写了一个简单的程序,在与服务器建立连接后通过HTTP接收数据。但是如果我尝试接收像图像这样的大对象,我就会遇到一个奇怪的问题。每次我运行程序时,打印HTTP数据总大小(没有标题)的最后一个print语句就会出现不同。所以我收到的是图像的损坏图像/部分。
有关为何会发生这种情况的任何想法?
编辑:如果在与htmlcontent
连接之前检查mainpage
的累积大小,那么在整个收据之后,大小与mainpage
的大小相同。所以问题不能出现在strcat
或任何其他字符串函数中。
答案 0 :(得分:1)
您忘记实施HTTP协议了! HTTP协议指定您何时知道整个对象的使用情况,例如,使用Content-Length
标头之类的内容。 您必须实施该协议。 recv
函数只知道它是从字节流中读取的。
此外,您对strlen
和strcat
的使用不正确。 recv
函数告诉您它收到了多少字节。 strlen
函数仅适用于字符串,而不是您尚未解析或处理的任意数据块。
答案 1 :(得分:0)
如果您strcat()
undefined buffer (mainpage)
,strlen()
将会返回任意结果。