1.http:下载
#ifndef GET_REQUEST
#define GET_REQUEST "GET %s HTTP/1.1/r/n" /
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; CNCDialer; Maxthon; .NET CLR 1.1.4322; .NET CLR 2.0.50727)/r/n" /
"Accept:text/html/r/n" /
"Accept-Language: zh-cn/r/n" /
"Host:%s/r/n" /
"Connection:close/r/n" /
"Cache-Control:no-cache/r/n" /
"/r/n"
#endif//GET_REQUEST
#ifndef MEMSIZE
#define MEMSIZE 1024*201
#endif//MEMSIZE
int Download(char* lpmemory,const char* strDstIp,const char* DstPort,const char* strUri,const char* strDomain);
int SendRecive(int &nsock,const char* strUri,const char* strDomain,char* lpmemory);
int Connect(const char* DstPort,const char* m_strDstIp);
//
//
int Download(char* lpmemory,const char* strDstIp,const char* DstPort,const char* strUri,const char* strDomain)
{
int nRet = -1;
int sock = Connect(DstPort,strDstIp);
if(sock == -1)
{
return nRet;
}
nRet = SendRecive(sock,strUri,strDomain,lpmemory);
if(sock != -1)
{
close(sock);
sock = -1;
}
return nRet;
}
//大于0 成功
int SendRecive(int &nsock,const char* strUri,const char* strDomain,char* lpmemory)
{
int nRet = -1;
char requetCmd[1024] = {0};
char buf[512] = {0};
snprintf(requetCmd,1024,GET_REQUEST,strUri,strDomain);
nRet = send(nsock,requetCmd,strlen(requetCmd),0);
if(nRet == -1)
{
close(nsock);
nsock = -1;
return nRet;
}
fd_set fds;
struct timeval tv = {1,0};
FD_ZERO(&fds);
FD_SET(nsock,&fds);
do{
nRet = select(nsock+1,&fds,NULL,NULL,&tv);
} while (false);
if(nRet <= 0){
printf("timeout----/n");
return nRet;
}
int nResult = 0;
int nReturn = 0;
do
{
if(FD_ISSET(nsock,&fds)<=0){
printf("recv failed...../n");
break;
}
if(nReturn + 500 + 3 > MEMSIZE)
{
printf("nReturn = %d,memsize = %d/n",nReturn,MEMSIZE);
break;
}
nResult = recv(nsock,lpmemory + nReturn,500,0);
nReturn += nResult;
} while (nResult > 0 || (nResult < 0 && errno == EINTR));
return nReturn;
}
int Connect(const char* DstPort,const char* m_strDstIp)
{
int sock = -1;
sock = socket(AF_INET,SOCK_STREAM,0);
if(sock == -1)
{
return -1;
}
struct sockaddr_in servaddr;
bzero(&servaddr,sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(DstPort));
servaddr.sin_addr.s_addr = inet_addr(m_strDstIp);
//设置connect 超时
struct timeval timeo={1,0};
socklen_t len = sizeof(timeo);
//setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, &timeo, len);
//---------------------------------------------------
if(connect(sock,(struct sockaddr *)&servaddr, sizeof(servaddr)) != 0)
{
if(errno == EINPROGRESS)
{
printf("connect timeout-----/n");
}
printf("connect failed ,errno = %d , errmsg = %s /n",errno,strerror(errno));
close(sock);
sock = -1;
}
return sock;
}
//