|
|
今天宿捨幾個突發奇想,希望在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;
}
|
|