0

我有一个问题recv。我编写了一个用数据填充结构的函数,以及从套接字读取的数据的长度(以字节为单位)。

为了测试,我只是stdout根据读取的字节总数逐字节打印数据recv。出于某种原因,读取的字节数有时似乎正确,有时则不正确,具体取决于我正在查询的站点。例如,以下代码在某些网站上按预期工作:

data->data_sz = 0;
while((i = recv(sock, data->data + data->data_sz, CHUNKSIZE, 0)) > 0)
{
    data->data_sz += i;
    if(databff - data->data_sz < CHUNKSIZE)
    {
        databff *= 2;
        if(!(tmp = realloc(data->data, databff)))
        {
            free(data->data);
            (void) WSACleanup();
            return 0;
        }
        data->data = tmp;
    }
}
i = strsbstr(data->data, "\r\n\r\n") + 4;                   //i = the position of the first char after header info  
if(i >= 0)  
{
    data->data_sz = data->data_sz - i;                      //data->data_sz = number of bytes without header info
    memmove(data->data, data->data + i, data->data_sz);
    if(!(tmp = realloc(data->data, data->data_sz)))
    {
        free(data->data);
        (void)WSACleanup();
        return 0;
    }
        data->data = tmp;                       
    }
    else
    {
        free(data->data);
        (void) WSACleanup();
        return 0;
    }
    return 1;
}

要将数据打印到stdout我只需使用 for 循环:

//t_html->data_sz points to my data->data_sz structure
//t_html->data points to my data->data structure
for(i = 0; i <= t_html->data_sz; i++) (void)fputc((int)t_html->data[i], stdout);

上面的代码适用于某些站点,但在其他站点上失败(例如,在查询时,http://www.google.com我希望最终字符是,</html>但我得到了</html>l)。

基本上我的问题是data->data_sz(接收的字节数)没有正确计算,这使得无法正确使用收集的数据。我真的不知道现在该做什么。

编辑:strsbstr这是上面代码中调用的函数:

int strsbstr(const char *str, const char *sbstr)
{
    char *sbstrlc;

    if(!(strcmp(str, sbstr))) return 0;
    if(!(sbstrlc = strstr(str, sbstr))) return -1;
    return (int) (sbstrlc - str);
}
4

1 回答 1

1
  1. recv(sock, data->data + data->data_sz, CHUNKSIZE, 0)是潜在的问题。为什么?CHUNKSIZE因为您的缓冲区中可能没有剩余空间。实际上,您已经databff - data->data_sz离开了(假设data分配给 的大小databff)。这完全取决于 and 的初始值databffCHUNKSIZE我看不到,我想指出这一点以防万一。
  2. 不能保证数据以 NULL 字符结尾。您的打印循环说i <= t_html->data_sz;哪个是错误的。应该是i < t_html->data_sz;。如果您使用<=,则您正在访问一个超出缓冲区的内容,这可能是您有时会得到一个奇怪字符的原因,有时却不会。
于 2012-11-14T21:02:25.853 回答