我实现了一个HTTP客户端,它可以通过指定主机名和端口来接收内容,并从socket中逐行显示。下面是我读的一行函数:
char* getLine(int fd)//fd is the socket number created before
{
char c, pre;
char* line = 0;
int size = 0;
while(read(fd, &c, 1)!=0)
{
line = realloc(line, ++size);//read a new char so re-allocation
line[size - 1] = c;
if(pre == '\r' && c == '\n')//this is a new line
{
break;
}
pre = c;
}
if(line)
{
line = realloc(line, ++size);
line[size - 1] = 0;//add a \0 at the end of line
}
return line;
}
以下是我在main函数中使用此函数的方法(假设已创建sockfd并已将请求发送到服务器)
char* line;
while((line = getLine(sockfd)) != NULL)
{
printf("%s", line);
if(!strcmp(line, "\r\n"))//blank line
printf("#####Now reading body.\n");
free(line);
}
问题是,当我尝试从google.com或yahoo.com等一些短页面获取内容时,它运行正常。但是,如果我想尝试一些长页面,例如www.stanford.edu,它会显示realloc(): invalid next size: 0x0000000000c794b0 ***
。
似乎我的指针在getLine
函数中有一些未定义的行为,但我真的不知道问题出在哪里。谁能给我一些暗示?谢谢!
**问题已解决,因此源代码已被删除。
答案 0 :(得分:4)
您在createQuery()中分配的缓冲区太小。
计算的长度不考虑HTTP_VERSION,也不考虑终止\ 0字节。结果是内存损坏和未定义的行为。