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

C cut char arry and save binary data from socket

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

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

的字段

我目前的功能:

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)

这对我来说已经足够了,但我想我也可以尝试 "rerun" 使用提取的 'Content-Length:' 信息来填充此功能 remain_data.. 猜想不再需要了在 while() 循环完成后。

但是话又说回来,即使还有数据要读取,recv() 函数 return <= 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)'?

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