c - 逐行读取套接字但出现内存问题

标签 c linux sockets http pointers

我实现了一个HTTP客户端,它可以通过指定主机名和端口接收内容,并从套接字逐行显示。下面是我读一行的函数:

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;
}

下面是我如何在主函数中使用这个函数(假设 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函数中有一些未定义的行为,但我真的不知道问题出在哪里。谁能给我一些提示?谢谢!

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

最佳答案

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

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

关于c - 逐行读取套接字但出现内存问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355624/

相关文章:

linux - 无法从/usr/local/lib访问本地共享库

php - PHP 中长命令的 exec() 问题

mysql - 如何使用 linux 命令行对远程数据库执行 "INSERT INTO"查询?

ruby - 是否可以在不实际发送或读取数据的情况下查明 ruby​​ 套接字是否处于 ESTABLISHED 或 CLOSE_WAIT 状态?

c - 当你有一个指向结构指针的指针时,你如何使用 realloc?

C 文件中的行数 (UNIX)

c - C union 中的变量对齐方式在所有系统上都相同吗?

multithreading - Adobe Air 桌面应用程序挂起(无响应)

linux - UDP 在同一台机器上广播?

c - 如何使用 pcap_breakloop?