http下载

来源:互联网 发布:淘宝好评语通用 编辑:程序博客网 时间:2024/04/30 13:19

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;
}
//////////////////////////////////////////////////////////////////////////

原创粉丝点击