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

标签 c sockets binary buffer

我目前正在用 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/

相关文章:

c++ - 如何编写与字节序无关的 C/C++ 代码?

使用 gcc 创建一个固定大小的部分并在其中放置值

c++ 检查 TCP 窗口是否已满?

javascript - net.connect.setTimeout - 连接或套接字是什么超时类型?

c - ASCII 到二进制表示形式(大端)

c - goto 指令跳到变长数组前面

c - 为什么 printf 从字面上打印 (null) 以及究竟发生了什么?

C套接字写太多次

android - ICS 键盘中的 makedict

python - 如何将输入的二进制文件转换为文本python