• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開(kāi)心的工作
            簡(jiǎn)單、開(kāi)放、平等的公司文化;尊重個(gè)性、自由與個(gè)人價(jià)值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            穿透代理服務(wù)器編程

            Posted on 2009-10-15 23:38 S.l.e!ep.¢% 閱讀(525) 評(píng)論(0)  編輯 收藏 引用 所屬分類: NetWork
            在日常工作和學(xué)習(xí)的時(shí),我們時(shí)常要和代理服務(wù)器打交道,
            比如通過(guò)企業(yè)、校園局域網(wǎng)上網(wǎng)的時(shí)候,一般代理服務(wù)器都支持幾種常見(jiàn)的代理協(xié)議標(biāo)準(zhǔn),如Socks4,Socks5,Http代理,其中Socks5需要用戶驗(yàn)證,代理起來(lái)比較復(fù)雜。
            我在查閱一些文檔和相關(guān)資料后,總結(jié)一些TCP協(xié)議穿透代理服務(wù)器的程序,希望能對(duì)大家有所幫助。

            //使用到的結(jié)構(gòu)
            struct sock4req1
            {
            char VN;
            char CD;
            unsigned short Port;
            unsigned long IPAddr;
            char other;
            };

            struct sock4ans1
            {
            char VN;
            char CD;
            };

            struct sock5req1
            {
            char Ver;
            char nMethods;
            char Methods;
            };

            struct sock5ans1
            {
            char Ver;
            char Method;
            };

            struct sock5req2
            {
            char Ver;
            char Cmd;
            char Rsv;
            char Atyp;
            char other;
            };

            struct sock5ans2
            {
            char Ver;
            char Rep;
            char Rsv;
            char Atyp;
            char other;
            };

            struct authreq
            {
            char Ver;
            char Ulen;
            char Name;
            char PLen;
            char Pass;
            };

            struct authans
            {
            char Ver;
            char Status;
            };

            //通過(guò)Socks4方式代理
            if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )
            {
            m_sError = _T("不能連接到代理服務(wù)器!");
            ClientSock.Close();
            return FALSE;
            }
            char buff;
            memset(buff,0,100);
            struct sock4req1 *m_proxyreq;
            m_proxyreq = (struct sock4req1 *)buff;
            m_proxyreq->VN = 4;
            m_proxyreq->CD = 1;
            m_proxyreq->Port = ntohs(GetPort());
            m_proxyreq->IPAddr = inet_addr(GetServerHostName());
            ClientSock.Send(buff,9);
            struct sock4ans1 *m_proxyans;
            m_proxyans = (struct sock4ans1 *)buff;
            memset(buff,0,100);
            ClientSock.Receive(buff,100);
            if(m_proxyans->VN != 0 || m_proxyans->CD != 90)
            {
            m_sError = _T("通過(guò)代理連接主站不成功!");
            ClientSock.Close();
            return FALSE;
            }




            //通過(guò)Socks5方式代理
            if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )
            {
            m_sError = _T("不能連接到代理服務(wù)器!");
            ClientSock.Close();
            return FALSE;
            }
            char buff;
            struct sock5req1 *m_proxyreq1;
            m_proxyreq1 = (struct sock5req1 *)buff;
            m_proxyreq1->Ver = 5;
            m_proxyreq1->nMethods = 2;
            m_proxyreq1->Methods = 0;
            m_proxyreq1->Methods = 2;
            ClientSock.Send(buff,4);
            struct sock5ans1 *m_proxyans1;
            m_proxyans1 = (struct sock5ans1 *)buff;
            memset(buff,0,600);
            ClientSock.Receive(buff,600);
            if(m_proxyans1->Ver != 5 || (m_proxyans1->Method!=0 && m_proxyans1->Method!=2))
            {
            m_sError = _T("通過(guò)代理連接主站不成功!");
            ClientSock.Close();
            return FALSE;
            }
            if(m_proxyans1->Method == 2)
            {
            int nUserLen = strlen(g_ProxyInfo.m_strProxyUser);
            int nPassLen = strlen(g_ProxyInfo.m_strProxyPass);
            struct authreq *m_authreq;
            m_authreq = (struct authreq *)buff;
            m_authreq->Ver = 1;
            m_authreq->Ulen = nUserLen;
            strcpy(m_authreq->Name,g_ProxyInfo.m_strProxyUser);
            m_authreq->PLen = nPassLen;
            strcpy(m_authreq->Pass,g_ProxyInfo.m_strProxyPass);
            ClientSock.Send(buff,513);
            struct authans *m_authans;
            m_authans = (struct authans *)buff;
            memset(buff,0,600);
            ClientSock.Receive(buff,600);
            if(m_authans->Ver != 1 || m_authans->Status != 0)
            {
            m_sError = _T("代理服務(wù)器用戶驗(yàn)證不成功!");
            ClientSock.Close();
            return FALSE;
            }
            }
            struct sock5req2 *m_proxyreq2;
            m_proxyreq2 = (struct sock5req2 *)buff;
            m_proxyreq2->Ver = 5;
            m_proxyreq2->Cmd = 1;
            m_proxyreq2->Rsv = 0;
            m_proxyreq2->Atyp = 1;
            unsigned long tmpLong = inet_addr(GetServerHostName());
            unsigned short port = ntohs(GetPort());
            memcpy(m_proxyreq2->other,&tmpLong,4);
            memcpy(m_proxyreq2->other+4,&port,2);
            ClientSock.Send(buff,sizeof(struct sock5req2)+5);
            struct sock5ans2 *m_proxyans2;
            memset(buff,0,600);
            m_proxyans2 = (struct sock5ans2 *)buff;
            ClientSock.Receive(buff,600);
            if(m_proxyans2->Ver != 5 || m_proxyans2->Rep != 0)
            {
            m_sError = _T("通過(guò)代理連接主站不成功!");
            ClientSock.Close();
            return FALSE;
            }




            //通過(guò)HTTP方式代理
            if( !ClientSock.Connect( g_ProxyInfo.m_strProxyIP,g_ProxyInfo.m_nProxyPort) )
            {
            m_sError = _T("不能連接到代理服務(wù)器!");
            ClientSock.Close();
            return FALSE;
            }
            char buff;
            sprintf( buff, "%s%s:%d%s","CONNECT ",GetServerHostName(),GetPort(),"
            HTTP/1.1rnUser-Agent: MyApp/0.1rnrn");
            ClientSock.Send(buff,strlen(buff)); //發(fā)送請(qǐng)求
            memset(buff,0,600);
            ClientSock.Receive(buff,600);
            if(strstr(buff, "HTTP/1.0 200 Connection established") == NULL) //連接不成功
            {
            m_sError = _T("通過(guò)代理連接主站不成功!");
            ClientSock.Close();
            return FALSE;
            }
            我們一般先與代理服務(wù)器連通,然后向代理服務(wù)器發(fā)送代理驗(yàn)證的用戶名和密碼
            (如果需要,如Socks5代理),驗(yàn)證成功后,再向代理服務(wù)器發(fā)送需要連接的目的
            地址和端口。以上代碼僅用于TCP方式連接
            无码国内精品久久人妻蜜桃| 久久精品无码一区二区日韩AV| 久久er国产精品免费观看8| 精品熟女少妇a∨免费久久| 乱亲女H秽乱长久久久| 97久久超碰成人精品网站| 久久福利青草精品资源站免费| 久久精品国产清自在天天线| 一本久道久久综合狠狠躁AV| 日本人妻丰满熟妇久久久久久| 亚洲狠狠久久综合一区77777 | 99久久人人爽亚洲精品美女| 久久se精品一区精品二区国产| 亚洲精品tv久久久久| 国产精品久久久久久福利漫画 | 人妻丰满?V无码久久不卡| 欧美激情一区二区久久久| 久久99免费视频| 国产精品亚洲综合久久| 日本道色综合久久影院| 影音先锋女人AV鲁色资源网久久| 国产综合精品久久亚洲| 久久精品蜜芽亚洲国产AV| 中文字幕无码久久久| 国产激情久久久久影院老熟女| 久久久久久午夜成人影院| 欧美久久久久久| 精品久久久久久无码人妻蜜桃| 无码人妻久久一区二区三区免费丨| 久久久久久久综合综合狠狠| 久久久无码精品亚洲日韩按摩| 免费无码国产欧美久久18| 亚洲国产一成久久精品国产成人综合 | 久久国产精品99久久久久久老狼 | 无码人妻久久一区二区三区免费| 亚洲精品无码久久毛片| 国产精品xxxx国产喷水亚洲国产精品无码久久一区| 久久精品免费一区二区| 欧美日韩精品久久久免费观看| 久久精品成人一区二区三区| 国产高潮久久免费观看|