中央論壇 - CENTER BBS

標題: 小小的httpget [打印本頁]

作者: f66666602    時間: 2007-7-27 20:51
標題: 小小的httpget
今天宿捨幾個突發奇想,希望在vim中輸入:q 關鍵字就直接可以進行google搜索。
本來用curl可以很簡便的處理這個問題的,可是為了熟悉下http協議,還是用socket寫了一個。
嗯,有個問題就是,還沒有對url進行轉義

#ifdef HAVE_CONFIG_H
#include <config.h>
#endif

#include <iostream>
#include <sstream>
#include <string>

#include <ace/OS.h>
#include <ace/Log_Msg.h>
#include <ace/INET_Addr.h>
#include <ace/SOCK_Connector.h>
#include <ace/SOCK_Stream.h>

#include "guard.h"

int main(int argc,char* argv[]){
  setlocale(LC_ALL,
"");
  
ACE::init();
  
ACE_SOCK_Connector conn;
  
ACE_SOCK_Stream peer;
  
ACE_INET_Addr peer_addr;
  
if(peer_addr.set(80,"www.google.com") == -1)
    ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT(
"解析域名失敗:%m")),-1);

  
if(conn.connect(peer,peer_addr) == -1){
      ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT(
"無法打開遠程連接:%m")),-1);
  }
  S_ON_BLOCK_EXIT_OBJ(peer,&
ACE_SOCK_Stream::close);
  
std::ostringstream oss;
  
std::string keyword;
  
if(argc<2)
    keyword=
"snnn";
  
else keyword=argv[1];
  oss<<
"GET /search?q="<<keyword<<" HTTP/1.0\r\n"
    "\r\n";
  
std::string s=oss.str();
  
const ACE_Time_Value timeout(10);
  
if(peer.send(s.c_str(),s.length(),0,&timeout) == -1)
    ACE_ERROR_RETURN((LM_ERROR,ACE_TEXT(
"%I發送請求失敗:%m\n%I請求的內容:%s\n"),s.c_str()),-1);
  
while(1){
   
char buf[20*1024];
   
ssize_t n=peer.recv(buf,sizeof(buf),0,&timeout);
   
if(n<=0) break;
   
std::cout<<"new content"<<std::endl;
   
std::cout.write(buf,n);
   
if(!memcmp(buf+n-7,"\r\n0\r\n\r\n",7)) break;
  }

  
return
0;
}





歡迎光臨 中央論壇 - CENTER BBS (https://www.centerbbs.com/) Powered by Discuz! X3