我有一个问题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);
}