CURL和我的小http客户机给出了不同的结果

CURL和我的小http客户机给出了不同的结果,c,http,tcp,C,Http,Tcp,我有一个实现HTTP客户机的小C程序。基本上我使用了一些轻微的修改,主要是为了调试 我的问题是,我使用这个返回的内容与我使用curl时得到的内容并不完全相同 基本上,代码的作用是: 为GET请求构造HTTP头 建立与服务器的TCP连接 发送HTTP头 收到回复 读取部分如下所示: while((recived_len = recv(sock, BUF, BUFSIZ-1, 0)) > 0) { BUF[recived_len] = '\0';

我有一个实现HTTP客户机的小C程序。基本上我使用了一些轻微的修改,主要是为了调试

我的问题是,我使用这个返回的内容与我使用
curl
时得到的内容并不完全相同

基本上,代码的作用是:

  • 为GET请求构造HTTP头
  • 建立与服务器的TCP连接
  • 发送HTTP头
  • 收到回复
读取部分如下所示:

while((recived_len = recv(sock, BUF, BUFSIZ-1, 0)) > 0)
    {   
        BUF[recived_len] = '\0';
        response = (char*)realloc(response, strlen(response) + strlen(BUF) + 1);
        sprintf(response, "%s%s", response, BUF);
        
    }
特别是,我总是在正文部分4字节的开头,我不知道它们来自哪里:

HTTP/1.1 200 OK
Date: Tue, 20 Apr 2021 09:17:54 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
P3P: CP="This is not a P3P policy! See g.co/p3phelp for more info."
Server: gws
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN
Set-Cookie: 1P_JAR=2021-04-20-09; expires=Thu, 20-May-2021 09:17:54 GMT; path=/; domain=.google.com; Secure
Set-Cookie: NID=213=ts4T4alAR2ODEf4vlWrmoZj-cjJcAXACbbxf64Zte4lEbuvUgik6TUgKkdY5OVHDQuTWM59DekV3ayNXDl08TcETU-WwztPVmMFz9BXegk93QFyno5WCS9fJDGq3sSrbFsFjxPOPCLTOx-b8H3a4Ed_HbI9lXBocjGu07ULo8PY; expires=Wed, 20-Oct-2021 09:17:54 GMT; path=/; domain=.google.com; HttpOnly
Accept-Ranges: none
Vary: Accept-Encoding
Connection: close
Transfer-Encoding: chunked

5225 // what is this?
<!doctype html><html dir="rtl" itemscope="" itemtype="http://schema.org/WebPage" lang="iw"><head><meta content="text/html; charset=UTF-8" http-equiv="Content-Type"><meta content="/images/branding/googleg/1x/googleg_standard_color_128dp.png" itemprop="image"><title>Google</title><script nonce="ks4dIW3TspucDhFX4XRWZA==">(function(){window.google={kEI:'Qpx-YKSmGIeSaPf3mJgP',

传输编码:chunked
是简短的答案。这就是我们使用HTTP库的原因,因为HTTP服务器往往支持多种编码、压缩算法等。您真的想自己实现所有这些吗?这些是下一个
块中的字节数。这实际上是您自己实现的HTTP各种传输编码中最简单的一种。实现它可能是一个很好的练习,但对于发布项目,您可能需要一个处理编码的库。
charset=ISO-8859-1
,这也可能给您一个提示。服务器有时会根据请求选择不同的字符集,以尝试与旧的web客户端兼容。您可能期望UTF-8,但这不是。祝你的项目好运。谢谢!我添加了一个
Accept:*/*
标题,就像
curl
那样,我确实得到了一个
内容类型:audio/mpeg
,正如预期的那样,但仍然不起作用:(捕获文件中的内容并进行比较)。
$ ./mp3player.out stream.mp3 
Note: Illegal Audio-MPEG-Header 0x04e248be at offset 2258.
Note: Trying to resync...
Note: Skipped 87 bytes in input.

Warning: Big change from first (MPEG version, layer, rate). Frankenstein stream?