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 也可以吗?
所以总结一下:
- 我的
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++ 编写一个小程序(在 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 也可以吗?
所以总结一下:
- 我的
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)'?
如果发件人为您完成,您就可以:如果发件人向您发送了您需要的正确数据量。