gpt4 book ai didi

c - 确定使用recv读取的字节数

转载 作者:行者123 更新时间:2023-11-30 15:54:00 25 4
gpt4 key购买 nike

我遇到了 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);
}

最佳答案

  1. recv(sock, data->data + data->data_sz, CHUNKSIZE, 0)是一个潜在的问题。为什么?因为你可能没有CHUNKSIZE缓冲区中还剩下空间。您有databff - data->data_sz实际上是左边(假设 data 分配给 databff 的大小)。这一切都取决于 databff 的初始值和CHUNKSIZE ,我看不到,我想我会指出这一点以防万一。
  2. 不保证数据以 NULL 字符终止。您的打印循环显示 i <= t_html->data_sz;这是错误的。应该是i < t_html->data_sz; 。如果您使用<= ,您正在访问超出缓冲区的字符,这可能就是为什么您有时会得到一个奇怪的字符,有时却不会。

关于c - 确定使用recv读取的字节数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13386886/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com