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

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

用VC++實現http代理

2019-11-17 05:16:48
字體:
來源:轉載
供稿:網友

  為了幫網友些個用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;



 ?。?)一些函數,用來取得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 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;
}


 ?。?)用于連接的函數

  這里是做了一些連接用的操作,分了兩種情況

  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;
}
QQ病毒 騰訊QQ空間代碼專題 PPT教程專題 ADSL應用面面俱到 fireworks教程專題 計算機和網絡技術基礎知識 校園網專題 網吧技術專題

  //設置接收超時
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;
}


 ?。?)發送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();
}

}


  基本就是這樣了,本人寫程序水平也不是很高,這個程序還是可以用的。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久九九全国免费精品观看| 国产伦精品一区二区三区精品视频| 91精品国产91久久久久久久久| 国产精品视频网| 91精品久久久久久久久久久久久| 精品久久香蕉国产线看观看gif| 91在线视频九色| 欧美国产视频日韩| 国产日韩精品在线播放| 欧美—级高清免费播放| 日本国产欧美一区二区三区| 精品高清一区二区三区| 亚洲一区二区三区xxx视频| 欧美噜噜久久久xxx| 欧美在线视频一区| 亚洲图中文字幕| 黑人巨大精品欧美一区二区三区| 欧美精品久久久久久久| 欧美日韩国产在线| 91精品久久久久久久久中文字幕| 日韩美女视频中文字幕| 7m第一福利500精品视频| 国产精欧美一区二区三区| 中文字幕日韩av综合精品| 欧美一区二区三区图| 亚洲欧美国产视频| 日韩欧美黄色动漫| 久久久久久久亚洲精品| 理论片在线不卡免费观看| 国产精品久久综合av爱欲tv| 国产日韩在线免费| 欧美日韩视频免费播放| 91成人在线观看国产| 欧美日韩亚洲一区二| 色青青草原桃花久久综合| 国产精品日韩av| 91色中文字幕| 精品国产精品三级精品av网址| 4444欧美成人kkkk| 欧美性xxxx极品hd满灌| 国产在线精品一区免费香蕉| 国内外成人免费激情在线视频网站| www.日本久久久久com.| 日韩欧美在线免费| 午夜精品蜜臀一区二区三区免费| 日本免费久久高清视频| 成人激情视频在线观看| 亚洲午夜精品久久久久久性色| 日韩中文字幕欧美| 热久久美女精品天天吊色| 国产91精品久久久久| 国内伊人久久久久久网站视频| 中日韩美女免费视频网址在线观看| 欧美亚洲日本网站| 欧美理论电影在线观看| 亚洲网站在线看| 久久激情视频免费观看| 91欧美日韩一区| 日韩欧美在线视频观看| 亚洲精品乱码久久久久久按摩观| 中文字幕亚洲无线码在线一区| 尤物九九久久国产精品的特点| 亚洲国产精品久久精品怡红院| 日韩免费观看视频| 亚洲欧美国产另类| 欧美电影免费在线观看| 日韩最新免费不卡| 国产一区在线播放| 日韩精品极品在线观看| 国产精品毛片a∨一区二区三区|国| 国产精品久久久久7777婷婷| 不卡av电影在线观看| 国产精品久久久久久久一区探花| 伊人激情综合网| 国产美女直播视频一区| 国产精品偷伦免费视频观看的| 成人日韩av在线| 久久久久久伊人| 久久精品视频亚洲| 国产精品久久久久久久久粉嫩av| 成人免费淫片aa视频免费| 国产成人黄色av| 久久免费国产精品1| 91精品国产成人www| 国产精品自拍小视频| 国产91在线播放| 免费91麻豆精品国产自产在线观看| 国产精品96久久久久久又黄又硬| 在线播放国产精品| 精品欧美激情精品一区| 国产精品久久久久久av福利| 91精品国产91| 成人黄色网免费| 欧美日本啪啪无遮挡网站| 欧美日韩亚洲系列| 亚洲欧美日韩在线一区| 国模极品一区二区三区| 亚洲偷欧美偷国内偷| 欧美乱大交xxxxx另类电影| 久久久国产精品亚洲一区| 久久国产精品久久精品| 亚洲男人7777| 久久久999国产| 在线午夜精品自拍| 91黑丝在线观看| 欧美与欧洲交xxxx免费观看| 欧美成人免费一级人片100| 欧美美女15p| 久热爱精品视频线路一| 日本欧美一级片| 91精品美女在线| 欧美日韩在线第一页| 国产精品精品一区二区三区午夜版| 欧美一区视频在线| 中文字幕亚洲字幕| 92看片淫黄大片欧美看国产片| 狠狠躁天天躁日日躁欧美| 国产精品视频网址| 欧美日韩一区二区精品| 日韩av在线网站| 国产精品爽黄69天堂a| 欧美一区二区三区免费观看| 日本一区二区三区在线播放| 亚洲精品电影网站| 欧美老女人xx| 69av视频在线播放| 日韩精品免费一线在线观看| 国产精品视频自拍| 97精品一区二区三区| 亚洲精品一区在线观看香蕉| 欧美高跟鞋交xxxxxhd| 日韩精品在线看| 日本午夜在线亚洲.国产| 国产精品久久久久久久久久久久久久| 国产精品视频久久久久| 亚洲人成伊人成综合网久久久| 在线免费看av不卡| 国产精品男人爽免费视频1| 日韩动漫免费观看电视剧高清| www.日韩欧美| 国模精品一区二区三区色天香| 久久久久久成人精品| 97免费中文视频在线观看| 疯狂做受xxxx高潮欧美日本| 久久99青青精品免费观看| 一区二区三区美女xx视频| 亚洲免费视频一区二区| 日韩视频―中文字幕| 成人免费激情视频| 欧美在线精品免播放器视频| 日韩av中文字幕在线| 成人精品久久av网站| 国产精品极品尤物在线观看| 久久综合色影院| 亚洲一区www| 国产精品最新在线观看| 亚洲精品按摩视频| 777午夜精品福利在线观看| 久久久久日韩精品久久久男男| 欧美大尺度电影在线观看| 国产精品扒开腿爽爽爽视频| 日韩在线观看免费全| 国产精品主播视频| 国产精品video|