套接字:获取未知字符而不是HTML内容

Jac*_*ack 1 c sockets linux gcc

我有这个简单的C代码,尝试使用80端口连接到www主机.我正常得到http标头响应,但我没有HTML内容,我得到了未知的字符(我打印垃圾吗?)

(facebook.com只是示例,它发生在任何服务器上)检查我的代码:

  #define BUF_SIZE 4096
  struct sockaddr_in sockaddr;
  struct hostent *host;

  char buffer[BUF_SIZE] = { 0 };
  int sock;

  static const char const headers[] =
    "GET / HTTP/1.1\r\n"
    "Host:www.facebook.com\r\n"
    "User-Agent:Mozilla/5.0 (X11; Linux i686; rv:7.0.1) Gecko/20100101 Firefox/7.0.1\r\n"
    "Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
    "Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
    "Accept-Encoding:gzip,deflate\r\n"
    "Connection:close\r\n"
    "\r\n\r\n";

  if((sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1) {
    perror("Cannot create TCP socket");
    exit(1);
  }

  if((host = gethostbyname("www.facebook.com")) == NULL) {
    perror("Cannot get host");
    exit(1);
  }

  memset(&sockaddr, 0, sizeof(sockaddr));
  sockaddr.sin_family = AF_INET;
  memcpy(&sockaddr.sin_addr,
     host -> h_addr_list[0],
     (size_t) host -> h_length);
  sockaddr.sin_family = AF_INET;
  sockaddr.sin_port = htons(80);

  if(connect(sock, (struct sockaddr *)&sockaddr, sizeof(struct sockaddr)) == -1) {
    perror("cannot connect");
    exit(1);
  }

  if(send(sock, headers, strlen(headers), 0) == -1) {
    perror("Cannot send packet");
    exit(1);
  }

  ssize_t readed;
  while((readed = recv(sock, buffer, BUF_SIZE, 0)) > 0) {
    write(fileno(stdout), buffer, readed);
    memset(buffer, 0, readed);
  }

  close(sock);
Run Code Online (Sandbox Code Playgroud)

回复示例:

HTTP/1.1 200 OK
Cache-Control: private, no-cache, no-store, must-revalidate
Expires: Sat, 01 Jan 2000 00:00:00 GMT
P3P: CP="Facebook does not have a P3P policy. Learn why here: http://fb.me/p3p"
Pragma: no-cache
X-Content-Type-Options: nosniff
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Set-Cookie: datr=7HVjUC3-OlTdOMH3HivA_8Ge; expires=Fri, 26-Sep-2014 21:38:52 GMT; path=/; domain=.facebook.com; httponly
Set-Cookie: reg_ext_ref=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; path=/; domain=.facebook.com
Set-Cookie: reg_fb_gate=http%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com
Set-Cookie: reg_fb_ref=http%3A%2F%2Fwww.facebook.com%2F; path=/; domain=.facebook.com
Content-Encoding: gzip
Content-Type: text/html; charset=utf-8
X-FB-Debug: 36+IohXvxWRp+3LHt+aLebawuS3W/MaBkmgR9TJGMrk=
Date: Wed, 26 Sep 2012 21:38:52 GMT
Transfer-Encoding: chunked
Connection: close

2f03
?}Yo?X??{?
?S-U)???P!????V??2?
                  F?A?AFr       -9
                                        ?
??0?p?{?1cx??1`???????0m?                ?
                         ?\??XH)3U?v??yy???{??g?O??:?l_?lKoh?????L??7??'K??{jW????,uM?ue+??L?uU[:?=U?T????{?LM???O?c????ou=ö$???;XR??G;K]?e;Kc?4?$u??Z{?P?c???[?6,?^u?w?????????K??m??v????A???v!?pm?m?W???'?A???k??q?????????Z?g???#?+???\??tU???????*s?V??7??W??[???????????xO??uM??jZ???ptR????Z5qv?QO???ww???5K7?????Mg?c^?C+h??M<;V????e???P?1???w???????~w~???????ky?U????X?????UTk\?Xw?'?b?V\????<??????b???z*?'%????[od??]?H??W????F??q? ??M?<?n?Owl)?>?fK?R~E?
                                                                                ??
[...]
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题?

ess*_*kar 5

删除行:

"Accept-Encoding:gzip,deflate\r\n"
Run Code Online (Sandbox Code Playgroud)

因为它告诉远程主机yoz接受压缩数据,你不要!