搜索
熱搜: 活動 交友 discuz
查看: 1898|回復: 0
打印 上一主題 下一主題

[教學] 小小的httpget

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-7-27 20:51:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
今天宿捨幾個突發奇想,希望在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;
}
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

本論壇為非營利之網路平台,所有文章內容均為網友自行發表,不代表論壇立場!若涉及侵權、違法等情事,請告知版主處理。


Page Rank Check

廣告刊登  |   交換連結  |   贊助我們  |   服務條款  |   免責聲明  |   客服中心  |   中央分站

手機版|中央論壇

GMT+8, 2026-6-4 10:26 , Processed in 0.031747 second(s), 16 queries .

Powered by Discuz!

© 2005-2015 Copyrights. Set by YIDAS

快速回復 返回頂部 返回列表