【发布时间】:2014-04-29 12:31:32
【问题描述】:
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 数据总大小(不包括标题)的打印语句都会有所不同。所以我收到的是损坏的图像/图像的一部分。
对为什么会发生这种情况有任何想法吗?
编辑:如果我在与mainpage 连接之前检查htmlcontent 的累积大小,即使在整个收据之后大小与mainpage 相同。所以问题不可能出在strcat 或任何其他字符串函数中。
【问题讨论】:
-
buf不是字符串(它嵌入了零字节);你不能对它应用str*函数。 -
我实际上已经将它声明为一个字符串,因为我这样做主要是为了解析 HTML 数据,我只是不明白为什么它拒绝为图像工作。我知道将图像二进制数据存储在 char * 中很奇怪,但我看不出为什么它每次都不应该在完全相同的查询上接收相同大小的数据!
-
@user1265125 那你就不明白TCP和HTTP的关系了。您以某种方式期望 TCP
recv函数为您执行 HTTP 协议逻辑。它不能那样做。你必须这样做。 -
其他人是正确的,因为您没有正确实现 HTTP 协议,并且您在应用 strxxx() 函数时不服从结果是二进制的。尽管如此,你的问题——据我所知——是为什么每次通话都会得到不同的结果/长度。这是因为您 strcat 到了一个未初始化的缓冲区(主页)。因为它可能会在随机位置有 NUL 字节,所以 strlen() 也会得到随机结果。