用HTTP代理下载文件详例
2007-03-22 21:31:27 来源:WEB开发网核心提示: (3)用来发送的部分void szcopy(char* dest,const char* src,int nMaxBytes){int i_cntr=0;while ((src[i_cntr]!='') || (i_cntr<nMaxBytes))dest[i_cnt
(3)用来发送的部分
void szcopy(char* dest,const char* src,int nMaxBytes)
{
int i_cntr=0;
while ((src[i_cntr]!='') || (i_cntr<nMaxBytes))
dest[i_cntr]=src[i_cntr++];
dest[i_cntr]='';
}
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="正在建立连接
";
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="
代理连接失败
";
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
User-Agent: MyApp/0.1
",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="连接代理失败
";
return 0;
}
message="代理连接完成
";
m_message.AddText("代理连接完成
");
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="连接完成
";
return 1;
}
更多精彩
赞助商链接