// 准备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;
}
(5)发送http请求,为下载数据进行准备
int CDLAngelDlg::SendHttpHeader()
{
//进行下载
CString temp;
BOOL bReturn;
char tmpBuffer[MAXBLOCKSIZE];
///第1行:方法,请求的路径,版本
temp="GET "+DownLoadAddress+hostFile+" HTTP/1.0\r";
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="发送请求失败";
return 0;
}
///第2行:主机
temp="Host "+strHost+"\r";
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="发送请求失败";
return 0;
}
///第3行:接收的数据类型
bReturn=SocketSend(HTTPSocket,"Accept: */*\r");
if(!bReturn)
{
message="发送请求失败";
return 0;
}
///第4行:
temp=DownLoadAddress;
temp.Insert(0,"Referer ");
temp+="\r";
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");
if(!bReturn)
{
message="发送请求失败";
return 0;
}
///第6行:连接设置,保持
// SocketSend(HTTPSocket,"Connection:Keep-Alive\r");
///第7行:Cookie.
bReturn=SocketSend(HTTPSocket,"Cache-Control: no-cache\r");
if(!bReturn)
{
message="发送请求失败";
return 0;
}
bReturn=SocketSend(HTTPSocket,"Proxy-Connection: Keep-Alive\r");
if(!bReturn)
{
message="发送请求失败";
return 0;
}
/// 续传
Range是要下载的数据范围,对续传很重要
if(continueFlag)
{
temp.Format("Range: bytes=%d- \r",conLength);
bReturn=SocketSend(HTTPSocket,temp);
if(!bReturn)
{
message="发送请求失败";
return 0;
}
}
///最后一行:空行
bReturn=SocketSend(HTTPSocket,"\r");
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();
}
}
基本就是这样了,本人写程序水平也不是很高,这个程序还是可以用的。
上一页 [1] [2]