gpt4 book ai didi

C 切割 char 数组并从 socket 中保存二进制数据

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:46 28 4
gpt4 key购买 nike

我目前正在用 C++ 编写一个小程序(在 Mac 上,其中包含一些 C 代码)并且需要从套接字中检索二进制数据(效果很好),但我还需要切断 HTTP标题。

基本上,我连接到服务器,发送 HTTP GET 请求,并获得 HTTP 200 标准 header 和二进制数据。我只需要二进制数据和 header 的 Content-Length: 字段。

到目前为止我的功能:

void read_binary_data(ssize_t len,long long remain_data, FILE *fd, int sock){

char buffer[BUFSIZ];

int checker = 0;
int curr_position = 0;

while (((len = recv(sock, buffer, BUFSIZ, 0)) > 0) && (remain_data > 0)){

// if(checker == 4) => http header until curr_position+1, data starts at curr_position+2
for(char *pointer = buffer; curr_position <= len ; pointer++){

if(*pointer == '\r' || *pointer == '\n'){
checker++;
}
else{
checker = 0;
}

if(checker == 4){
break;
}
curr_position++;
}
fwrite(buffer, sizeof(char), len, fd);
remain_data -= len;
}
}

我最初会传递 remain_data = 999 只是为了进入 while 循环(是的,我需要在那里进行一些错误处理,但目前这不是问题所在)。

现在 for() 循环应该检查 HTTP header 末尾的 '\r\n\r\n';我会那样得到它吗?

然后,我如何将二进制数据从缓冲区复制到另一个缓冲区,然后使用 fwrite() 将其写入文件? (没有 HTTP header )

这对我来说就足够了,但我想我也可以尝试使用提取的“Content-Length:”信息“重新运行”这个函数来填充 remain_data ..我猜 while() 循环结束后就不再需要了完成。

但话又说回来,即使还有数据要读取,recv() 函数能否返回 <= 0?

总结一下:

  • 我的 for() 循环是否正确?
  • 如何从缓冲区中剪切 HTTP header ?
  • 我可以安全地删除“&& (remain_data > 0)”吗?

最佳答案

Is for loop correct?

不,不是

即使您有 "\r\r\r\r" 或两个字符的所有组合,您的 if(checker == 4) 也可能为真

你可以这样写

char *pointer = buffer;
int remaining = len;
for(; remaining ; remaining--)
{
if ((*pointer == '\r') && (remaining > 3))
{
if (!strncmp(pointer, "\r\n\r\n", 4))
{
pointer+=4;
remaining-=4;
break;
}
}

pointer++;
}

how can i cut the HTTP header from buffer?

我不确定我是否理解你。如果您需要复制 "\r\n\r\n" 之后的所有数据,您可以根据上面的代码执行以下操作:

fwrite(pointer, sizeof(char), remaining, fd);

can i safely delete the '&& (remain_data > 0)'?

如果发件人为您做这件事,您就可以:如果发件人向您发送了您需要的正确数据量。

关于C 切割 char 数组并从 socket 中保存二进制数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32908299/

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