亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

透過代理看世界 用VC++實現http代理

2019-11-17 05:09:38
字體:
來源:轉載
供稿:網友
  為了幫網友些個用http下載動畫的程序,臨時在網上翻了翻,看看有沒有利用http代理來下載的例子。結果,似乎很多人都愿意去轉載一個有頭無尾的例子,還美其名曰“我在查閱RFC文檔和相關資料后,特總結一些TCP協議穿透代理服務器的程序片斷,希望對大家有所幫助?!?
  假如真的想幫助大家,為什么不說的具體一些?  無奈之下,自己去翻rfc文檔,找了些資料,寫了這個利用http代理來下載文件的資料  代碼如下: ?。?)一些基本變量SOCKET                                    HTTPSocket;   // 主socket
strUCt sockaddr_in                   SocketAddr;   // address socket
struct sockaddr_in                   BindSocket;   // for bind
int   m_nRecvTimeout;  // recieve timeout
int   m_nSendTimeout;  // send timeout WSADATA           wsaData; // 要下載文件部分。似乎在BindSocket.sin_addr.s_addr = inet_addr (strHost);時,只能使用ip地址,所以了。。。// 假如誰知道更好的方法,別忘了告訴我一下。CString strHost="111.111.111.111 ";
CString DownLoadAddress="http://www.aitenshi.com/bbs/images/";
CString hostFile="logo.gif";
int HttpPort=80;
  (2)一些函數,用來取得http頭,和獲取文件大小int GetFileLength(char *httpHeader)
{
        CString strHeader;
         int local;
         strHeader=(CString)httpHeader;
         local=strHeader.Find("Content-Length",0);
         local+=16;
         strHeader.Delete(0,local);
         local=strHeader.Find("/r");
         strHeader.SetAt(local,'/0');         char temp[30];
         strcpy(temp,strHeader.GetBuffer(strHeader.GetLength()));
         return atoi(temp);
}
int GetHttpHeader(SOCKET sckDest,char *str)
{
         BOOL m_bResponsed=0;
         int m_nResponseHeaderSize;         if(!m_bResponsed)
         {
                  char c = 0;
          int nIndex = 0;
          BOOL bEndResponse = FALSE;
          while(!bEndResponse && nIndex < 1024)
          {
                   recv(sckDest,&c,1,0);
                   str[nIndex++] = c;
                   if(nIndex >= 4)
                   {
                            if(str[nIndex - 4] == '/r' && str[nIndex - 3] == '/n'
                             && str[nIndex - 2] == '/r' && str[nIndex - 1] == '/n')
                            bEndResponse = TRUE;
                   }
          }
          m_nResponseHeaderSize = nIndex;
          m_bResponsed = TRUE;
         }
 
 return  m_nResponseHeaderSize;
 
} ?。?)用來發送的部分void szcopy(char* dest,const char* src,int nMaxBytes)
{
         int i_cntr=0;
         while ((src[i_cntr]!='/0') (i_cntr<nMaxBytes))
                    dest[i_cntr]=src[i_cntr++];
         dest[i_cntr]='/0';
}BOOL SocketSend(SOCKET sckDest,const char* szHttp)
{
    char szSendHeader[MAXHEADERLENGTH];
    int iLen=strlen(szHttp);
    szcopy(szSendHeader,szHttp,iLen);
    if(send (sckDest  ,(const char FAR *)szSendHeader ,iLen ,0)==SOCKET_ERROR)
    {
               closesocket(sckDest);
               AfxMessageBox("Error when send");
                return FALSE;
    }    return TRUE;
}BOOL SocketSend(SOCKET sckDest,CString szHttp)
{    int iLen=szHttp.GetLength();
    if(send (sckDest,szHttp,iLen,0)==SOCKET_ERROR)
    {
               closesocket(sckDest);
               AfxMessageBox("Error when send");
                return FALSE;
    }    return TRUE;
}  (4)用于連接的函數  這里是做了一些連接用的操作,分了兩種情況  1)假如沒有使用代理,則直接連到你指定的計算機  2)假如使用了代理,則直接連到代理BOOL CDLAngelDlg::ConnectHttp()
{ message="正在建立連接/n";
  UpdateData(TRUE);
 if(m_combo=="HTTP")    // m_combo 一個下拉條
 {
           HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
            SocketAddr.sin_addr.s_addr = inet_addr (m_ProxyAddr);
            SocketAddr.sin_family=AF_INET;
            SocketAddr.sin_port=htons(atoi(m_Port));            struct fd_set fdSet;
            struct timeval tmvTimeout={0L,0L};
 
            FD_ZERO(&fdSet);
            FD_SET(HTTPSocket, &fdSet);
 
            if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR)
            {
                       closesocket(HTTPSocket);
                       AfxMessageBox("Error when select.");
                       return 0;
            }

            if (connect(HTTPSocket, (const struct sockaddr *)&SocketAddr, sizeof(SocketAddr))==SOCKET_ERROR)
            {
                       message="/n代理連接失敗/n";
                       m_message.CleanText();
                       m_message.AddText(message);
                       return 0;
            }//  發送CONNCET請求令到代理服務器,用于和代理建立連接//代理服務器的地址和端口放在m_ProxyAddr,m_Port 里面            CString temp;
            char tmpBuffer[1024];
            temp.Format("CONNECT %s:%s HTTP/1.1/r/nUser-Agent: MyApp/0.1/r/n/r/n",m_ProxyAddr,m_Port);
            if(!SocketSend(HTTPSocket,temp))
            {
                       message="連接代理失敗";
                       return 0;
            }// 取得代理響應,假如連接代理成功,代理服務器將返回200 Connection established            GetHttpHeader(HTTPSocket,tmpBuffer);
            temp=tmpBuffer;
            if(temp.Find("HTTP/1.0 200 Connection established",0)==-1)
            {
                       message="連接代理失敗/n";
                       return 0;
            }            message="代理連接完成/n";
            m_message.AddText("代理連接完成/n");
            return 1;   // ----------〉這里是應該注重的,連接到代理后,就可以返回了,不需要再連接網上的另外一臺機,代理服務器會自動轉發數據,所以,連接完代理就像連接到網上另外一臺機一樣
 }
//  這個,是為了給其他代理做預備
 else if(m_combo=="Socks4")
 {MessageBox("請注重,現在無法使用代理功能!");}
 else if(m_combo=="Socks5")
 {MessageBox("請注重,現在無法使用代理功能!");}//  假如沒有使用代理,就要連接到網上的另一臺機// 預備socket
  HTTPSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
      
 if (HTTPSocket==INVALID_SOCKET)
 {
  AfxMessageBox("Error when socket");
  return 0;
 }//設置超時
 struct linger zeroLinger;
 zeroLinger.l_onoff = 1;
 zeroLinger.l_linger = 0;
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_LINGER
  ,(const char *)&zeroLinger
  ,sizeof(zeroLinger))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setscokopt(LINGER)");
            return 0;
 }//設置接收超時
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_RCVTIMEO
  ,(const char *)&m_nRecvTimeout
  ,sizeof(m_nRecvTimeout))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setsockopt(RCVTIME).");
            return 0;
 }//設置發送超時
 if(setsockopt(HTTPSocket,SOL_SOCKET,SO_SNDTIMEO
  ,(const char *)&m_nSendTimeout
  ,sizeof(m_nSendTimeout))!=0)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when setsockopt(SNDTIMEO).");
            return 0;
 }
 SocketAddr.sin_addr.s_addr = htonl (INADDR_ANY);
 SocketAddr.sin_family=AF_INET;// 進行端口綁定
 if (bind (HTTPSocket,
  (const struct sockaddr FAR *)&SocketAddr,
  sizeof(SocketAddr))==SOCKET_ERROR)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when bind socket.");
            return 0;
 }//預備連接 /// 預備連接信息
 BindSocket.sin_addr.s_addr = inet_addr (strHost);
 BindSocket.sin_family=AF_INET;
 BindSocket.sin_port=htons(HttpPort);
 struct fd_set fdSet;
 struct timeval tmvTimeout={0L,0L};
 
 FD_ZERO(&fdSet);
 FD_SET(HTTPSocket, &fdSet);
 
 if (select(0,&fdSet,NULL,NULL,&tmvTimeout)==SOCKET_ERROR)
 {
            closesocket(HTTPSocket);
            AfxMessageBox("Error when select.");
            return 0;
 }
// 連接
 if (connect(HTTPSocket, (const struct sockaddr *)&BindSocket, sizeof(BindSocket))==SOCKET_ERROR)
 {
            AfxMessageBox("第一次連接失敗,預備第二次連接");
            if (connect(HTTPSocket
            ,(const struct sockaddr *)&BindSocket
            ,sizeof(BindSocket))==SOCKET_ERROR)
            {
                       closesocket(HTTPSocket);
                       AfxMessageBox("連接失敗");
                       return 0;
            } } message="連接完成/n";
 
 return 1;
}  (5)發送http請求,為下載數據進行預備

int CDLAngelDlg::SendHttpHeader()
{
//進行下載  CString temp;
 BOOL bReturn;
 char tmpBuffer[MAXBLOCKSIZE];
///第1行:方法,請求的路徑,版本
 temp="GET "+DownLoadAddress+hostFile+" HTTP/1.0/r/n";
 bReturn=SocketSend(HTTPSocket,temp);
 if(!bReturn)
 {
  message="發送請求失敗";
  return 0;
 }
///第2行:主機
 temp="Host "+strHost+"/r/n";
 bReturn=SocketSend(HTTPSocket,temp);
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }
///第3行:接收的數據類型
 bReturn=SocketSend(HTTPSocket,"Accept: */*/r/n");
   if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }
///第4行:
 temp=DownLoadAddress;
 temp.Insert(0,"Referer ");
 temp+="/r/n";
 bReturn=SocketSend(HTTPSocket,temp);
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }
///第5行:瀏覽器類型 bReturn=SocketSend(HTTPSocket,"User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt; DTS Agent;)/r/n");
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }
///第6行:連接設置,保持
// SocketSend(HTTPSocket,"Connection:Keep-Alive/r/n");///第7行:Cookie. bReturn=SocketSend(HTTPSocket,"Cache-Control: no-cache/r/n");
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }
 bReturn=SocketSend(HTTPSocket,"Proxy-Connection: Keep-Alive/r/n");
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }/// 續傳Range是要下載的數據范圍,對續傳很重要
 if(continueFlag)
 {
            temp.Format("Range: bytes=%d- /r/n",conLength);
            bReturn=SocketSend(HTTPSocket,temp);
            if(!bReturn)
            {
             message="發送請求失敗";
             return 0;
            }
 }///最后一行:空行
 bReturn=SocketSend(HTTPSocket,"/r/n");
 if(!bReturn)
 {
            message="發送請求失敗";
            return 0;
 }///取得http頭
 int i;
 i=GetHttpHeader(HTTPSocket,tmpBuffer);
 if(!i)
 {
            message="獲取HTTP頭出錯";
            return 0;
 }//假如取得的http頭含有404等字樣,則表示連接出問題
 temp=tmpBuffer;
 if(temp.Find("404")!=-1)
 {  return 0;
 }// 得到待下載文件的大小 filelength=GetFileLength(tmpBuffer); return 1;
}  這樣,就連接到網上的另一臺機了,如何下載數據,不用多說了吧while((num!=SOCKET_ERROR) && (num!=0))
    {
       num=recv (HTTPSocket
                        ,(char FAR *)tmpBuffer
                        ,(MAXBLOCKSIZE-1)
            ,0);
        file.Write(tmpBuffer,num);    if(ExitFlag)
   {
                file.Close();
                closesocket(HTTPSocket);
                DownComplete=1;                m_message.CleanText();
                m_message.ShowColorText(RGB(128,128,0),DLCompleteMes);                m_progress.ShowWindow(SW_HIDE);
                m_stopDownload.ShowWindow(SW_HIDE);
                _endthread();
   } }  基本就是這樣了,本人寫程序水平也不是很高,這個程序還是可以用的。 更多文章 更多內容請看HTTP協議專題,或

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品一区| 色综合久久88色综合天天看泰| 国产午夜精品视频免费不卡69堂| 亚洲国产成人久久综合| 国产精品国产亚洲伊人久久| 亚洲影院在线看| 精品久久香蕉国产线看观看gif| 尤物yw午夜国产精品视频明星| xxx欧美精品| 亚洲成人网av| 91久久中文字幕| 91精品视频在线看| 久久国产视频网站| 91久久精品在线| 北条麻妃在线一区二区| 色av吧综合网| 国产色综合天天综合网| 日韩**中文字幕毛片| 一道本无吗dⅴd在线播放一区| 国产精品一区av| 欧美日韩综合视频| 国产一级揄自揄精品视频| 日韩高清电影免费观看完整| 亚洲精品欧美一区二区三区| 555www成人网| 大荫蒂欧美视频另类xxxx| 日本一本a高清免费不卡| 91精品国产高清久久久久久| 国产精品日韩av| 另类视频在线观看| 欧美电影免费播放| 91av在线精品| 亚洲第一综合天堂另类专| 日韩在线免费高清视频| 亚洲第一区中文99精品| 亚洲精品国产欧美| 国产精品久久综合av爱欲tv| 久久免费视频网站| 一本色道久久88精品综合| xvideos国产精品| 久久精品视频播放| 久久精品2019中文字幕| 91久久国产精品91久久性色| 成人欧美在线观看| 91精品国产乱码久久久久久久久| 欧美激情精品在线| 久久久久久久一区二区三区| 色综合久久天天综线观看| 久久久最新网址| 国产一区二区视频在线观看| 福利微拍一区二区| 久久91亚洲精品中文字幕| 久热精品视频在线观看一区| 欧美电影在线观看| 国产精品无码专区在线观看| 亚洲自拍偷拍色片视频| 国产免费一区视频观看免费| 国产成人a亚洲精品| 日韩精品有码在线观看| 亚洲国产欧美久久| 久久久久久97| 欧美专区国产专区| 亚洲午夜激情免费视频| 国产精品成人v| 欧美在线视频一区二区| 亚洲精品久久久久久久久久久| 热久久99这里有精品| 日韩国产欧美区| 亚洲影院污污.| 欧美成人激情视频| 日韩在线观看你懂的| 久久中文久久字幕| 在线看国产精品| 国产裸体写真av一区二区| 欧美精品中文字幕一区| 精品久久久在线观看| 国产精品视频永久免费播放| 欧美激情一区二区三区在线视频观看| 国产一区av在线| 国产精品jizz在线观看麻豆| 日韩hd视频在线观看| 亚洲精品动漫久久久久| 久久久91精品国产| 91精品久久久久久久久久久久久| 日韩精品免费在线视频观看| 韩国美女主播一区| 伊人久久男人天堂| 亚洲国产欧美日韩精品| 亚洲在线观看视频网站| 国产精品普通话| www.精品av.com| 精品久久中文字幕久久av| 中文字幕日韩欧美在线| 欧美理论在线观看| 欧美成年人视频| 国产精品免费久久久久影院| 国产有码在线一区二区视频| 亚洲影视中文字幕| 亚洲精品久久久久久久久| 国产欧美 在线欧美| 一区二区三区天堂av| 亚洲日韩第一页| 欧美午夜视频在线观看| 日韩中文在线视频| 亚洲国产欧美一区二区三区久久| 国产精品美腿一区在线看| 亚洲第一页中文字幕| 国产www精品| 亚洲人永久免费| 欧美亚洲另类激情另类| 日韩亚洲欧美中文在线| 久久久免费高清电视剧观看| 欧美日韩在线视频观看| 欧美成人精品xxx| 久久久影视精品| 午夜精品蜜臀一区二区三区免费| 日韩在线一区二区三区免费视频| 国产一区视频在线| 992tv成人免费视频| 日韩亚洲成人av在线| 欧美视频免费在线| 国产精品海角社区在线观看| 亚洲精品自在久久| 欧美在线免费视频| 欧美日韩国产精品一区二区三区四区| 欧美孕妇与黑人孕交| 欧美成人午夜激情在线| 91久久久久久久久久久| 日韩精品在线观| 国产精品福利片| 久久高清视频免费| www国产亚洲精品久久网站| 亚洲xxxxx| 成人黄在线观看| 国产精品久久久久久久久借妻| 精品久久久免费| 日韩精品免费看| 国产午夜精品视频| 久久亚洲综合国产精品99麻豆精品福利| 91国偷自产一区二区三区的观看方式| 欧美极品美女视频网站在线观看免费| 日韩电影大片中文字幕| 欧美老少配视频| 欧美wwwwww| 亚洲欧美精品中文字幕在线| 精品国产91久久久久久老师| 欧美国产精品人人做人人爱| 久久久免费观看视频| 国产精品视频午夜| 精品久久久国产| 日本不卡免费高清视频| www.亚洲成人| 欧美精品videos性欧美| 91色在线观看| 久久久亚洲国产| 亚洲欧美日韩天堂一区二区| 国产亚洲欧美日韩美女| 国产一区二区三区四区福利| 国产一区视频在线播放| 亚洲国产精品va在线看黑人| 一色桃子一区二区| 欧美日韩爱爱视频| 久久精品国产电影| 欧美日韩一区二区免费在线观看|