逐行读取插座但发生内存问题

时间:2015-02-05 22:55:42

标签: c linux sockets http pointers

我实现了一个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函数中有一些未定义的行为,但我真的不知道问题出在哪里。谁能给我一些暗示?谢谢!

**问题已解决,因此源代码已被删除。

1 个答案:

答案 0 :(得分:4)

您在createQuery()中分配的缓冲区太小。

计算的长度不考虑HTTP_VERSION,也不考虑终止\ 0字节。结果是内存损坏和未定义的行为。