0

我正在尝试使用 winsock 以编程方式检索 twitter RSS 提要,并且看起来尽可能像真正的浏览器。我不想使用 WinINET。获取数据似乎有效,但 gzip_decompress 没有。我正在使用来自http://code.msdn.microsoft.com/windowsdesktop/An-Asynchronous-HTTP-382f98ce的 gzip_decompress

void gettweet()
{
  std::string szHost = "api.twitter.com";
  std::string szIP = ResolveDns(szHost);
  std::string szUri = "/1/statuses/user_timeline.rss?screen_name=johnlol";
  std::string szRequest;

  szRequest += "GET " + szUri + " HTTP/1.1\r\n";
  szRequest +=
    "Accept: text/html, application/xhtml+xml, */*\r\n" \
    "Accept-Language: en-US\r\n" \
    "User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)\r\n" \
    "Accept-Encoding: gzip, deflate\r\n" \
    //"Accept-Encoding: text\r\n"
    "Connection: Keep-Alive\r\n" \
    "Host: " + szHost + "\r\n" \
    "\r\n";

  SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  if (sock < 0) {
    MessageBox(0,"couldnt create socket.",0,0);
    return;
  }

  struct sockaddr_in serveraddr;
  memset(&serveraddr, 0, sizeof(serveraddr));

  serveraddr.sin_family      = AF_INET;
  serveraddr.sin_addr.s_addr = inet_addr(szIP.c_str());
  serveraddr.sin_port        = htons(80);

  if (connect(sock, (struct sockaddr *) &serveraddr, sizeof(serveraddr)) != 0) {
    MessageBox(0,"couldnt connect.",0,0);
    return;
  }

  if (send(sock, szRequest.c_str(), szRequest.length(), 0) != szRequest.length()) {
    MessageBox(0,"couldnt send.",0,0);
    return;
  }

  char buffer[4096];
  std::string szBuffer;

while (1)
  {
    int len = recv(sock,buffer,sizeof(buffer),0);
    if (len == 0 || len == SOCKET_ERROR)
      break;

    for (int i = 0; i <= len; i++)
      szBuffer += buffer[i];
    ZeroMemory(buffer,sizeof(buffer));
  }

  if (int pos = szBuffer.find("\r\n\r\n") != std::string::npos) {

    szBuffer.erase(0,pos+4);
    if (szBuffer.size() <= 10) {
      gettweet();
      return;
    }
    FILE *fp; fopen_s(&fp,"test.txt","ab+");fputs(szBuffer.data(),fp);fclose(fp);

    if (szBuffer.data()[0] == 0x1F && szBuffer.data()[1] == 0xFFFFFF8B) {// gzip headers
      std::string raw_data;
      if (!gzip_decompress(szBuffer.c_str(),szBuffer.size(),raw_data))
        MessageBox(0,"decompress failed.",0,0);
      else
        MessageBox(0,raw_data.c_str(),0,0);
      //FILE *fp; fopen_s(&fp,"test.txt","ab+");fputs(szBuffer.data(),fp);fclose(fp);
      exit(0);
    }
  }

  closesocket(sock);
}
4

0 回答 0