void DownloadPackage::DownloadThreadExcute() { if (m_strDownloadURL.empty() || m_strDownloadSavePath.empty()) { LOGERROR("DownloadStatusFailed!!"); if (m_pkDownloadListener) { m_pkDownloadListener->processDownloadEvent(DownloadStatusResNotFound); } return; } LOGD("Download path is %s,Download URL is %s", m_strDownloadSavePath.c_str(), m_strDownloadURL.c_str()); char szTempDir[100] = { 0 }; Rstrchr(m_strDownloadSavePath.c_str(), '/', szTempDir); string strSaveDir(szTempDir); #ifndef WIN32 if (!KDirectory::isDirectoryExist(strSaveDir)) { if (!KDirectory::createDir(strSaveDir)) { LOGERROR("Create dir failed", strSaveDir.c_str()); m_pkDownloadListener->processDownloadEvent(DownloadStatusFailed); return; } } #endif m_pkHttp->setTimeout(60 * 1000); //获取已经下载文件的大小,如果已经存在,则进行续传 m_nFileLen = 0; int nStartPos = GetFileSize(m_strDownloadSavePath.c_str()); LOGD("Download startpos is %d", nStartPos); int nDoneLength = m_pkHttp->getHttpFile(m_strDownloadURL.c_str(), m_strDownloadSavePath.c_str(), nStartPos); if (nStartPos > 0 && m_pkHttp->getStatusCode() == 416) { LOGD("already Download succeeded ,to unzip file!"); if (m_pkDownloadListener) { m_pkDownloadListener->processDownloadEvent(DownloadStatusSuccess); } return; } //网络连接失败,进行重新连接尝试 int nReconnectCount = RECONNECTCOUNT; if (nDoneLength == -1 || ((nDoneLength < m_nFileLen) && (nDoneLength > 0))) { while (nReconnectCount) { nReconnectCount--; sleep(10000); m_nFileLen = 0; nStartPos = GetFileSize(m_strDownloadSavePath.c_str()); nDoneLength = m_pkHttp->getHttpFile(m_strDownloadURL.c_str(), m_strDownloadSavePath.c_str(), nStartPos); if ((nDoneLength >= m_nFileLen) && (m_nFileLen > 0)) { break; } } } LOGD("Download length is %d,File length is %d", nDoneLength, m_nFileLen); if (m_pkHttp->getStatusCode() == 404) { LOGERROR("Download DownloadStatusResNotFound!"); if (m_pkDownloadListener) { m_pkDownloadListener->processDownloadEvent(DownloadStatusResNotFound); } } else if ((nDoneLength >= m_nFileLen) && (nDoneLength > 0)) { LOGD("Download succeeded!"); if (m_pkDownloadListener) { m_pkDownloadListener->processDownloadEvent(DownloadStatusSuccess); } } else { LOGERROR("DownloadStatusFailed,Status code is %d", m_pkHttp->getStatusCode()); if (m_pkDownloadListener) { m_pkDownloadListener->processDownloadEvent(DownloadStatusFailed); } } }
/************************************************************** 功能:从字符串 src 中分析出网站地址和端口,并得到文件和目录 ***************************************************************/ int GetHost(char * src, char ** web, char ** file, int * port, char ** dir) { char * pA, * pB, * pC; int len; *port = 0; if(!(*src)) return -1; pA = src; if(!strncmp(pA, "http://", strlen("http://"))) pA = src+strlen("http://"); /* else if(!strncmp(pA, "https://", strlen("https://"))) pA = src+strlen("https://"); */ else return 1; pB = strchr(pA, '/'); if(pB) { len = strlen(pA) - strlen(pB); GetMemory(web, len); memcpy((*web), pA, len); if(*(pB+1)) { Rstrchr(pB + 1, '/', &pC); if(pC) len = strlen(pB + 1) - strlen(pC); else len = 0; if(len > 0) { GetMemory(dir, len); memcpy((*dir), pB + 1, len); if(pC + 1) { len = strlen(pC + 1); GetMemory(file, len); memcpy((*file), pC + 1, len); } else { len = 1; GetMemory(file, len); memcpy((*file), e, len); } } else { len = 1; GetMemory(dir, len); memcpy((*dir), e + 1, len); len = strlen(pB + 1); GetMemory(file, len); memcpy((*file), pB + 1, len); } } else { len = 1; GetMemory(dir, len); memcpy((*dir), e + 1, len); len = 1; GetMemory(file, len); memcpy((*file), e, len); } } else { len = strlen(pA); GetMemory(web, len); memcpy((*web), pA, strlen(pA)); len = 1; GetMemory(dir, len); memcpy((*dir), e + 1, len); len = 1; GetMemory(file, len); memcpy((*file), e, len); } pA = strchr((*web), ':'); if(pA) *port = atoi(pA + 1); else *port = 80; return 0; }
/************************************************************** 功能:为当前节点增加子节点 ***************************************************************/ void AddChildNode(WEBNODE * node, char * src) { int WebPort, len; char * WebHost = 0, * PageAddress = 0, * WebDir = 0, * pC = 0; WEBNODE * NewNode; char filename[MAXFILENAME + 1] = ""; char IsFromRoot = 0; if(!src) return; if(!strncasecmp(src, "mailto:", strlen("mailto:"))) return ; if(strstr(src, ".css")) return; if(strstr(src, ".xml")) return; if(strstr(src, ".ico")) return; if(strstr(src, ".jpg")) return; if(strstr(src, ".gif")) return; if(strstr(src, "javascript:")) return; if(strstr(src, "+")) return; ret = GetHost(src, &WebHost, &PageAddress, &WebPort, &WebDir); if(ret) { len = strlen(node->host); GetMemory(&WebHost, len); strcpy(WebHost, node->host); WebPort = node->port; IsFromRoot = !strncmp(src, "/", 1); if(IsFromRoot && (src + 1)) Rstrchr(src + 1, '/', &pC); else if(!IsFromRoot) Rstrchr(src, '/', &pC); else pC = 0; if(pC) { if(IsFromRoot) len = strlen(src + 1) - strlen(pC); else len = strlen(src) - strlen(pC) + strlen(node->dir) + 1; GetMemory(&WebDir, len); if(IsFromRoot) memcpy(WebDir, src + 1, len); else {memcpy(WebDir, node->dir, strlen(node->dir)); strcat(WebDir, "/"); memcpy(WebDir + strlen(node->dir) + 1, src, strlen(src) - strlen(pC));} if(pC + 1) { len = strlen(pC + 1); GetMemory(&PageAddress, len); strcpy(PageAddress, pC + 1); } else { len = 1; GetMemory(&PageAddress, len); memcpy(PageAddress, e, len); } } else { if(IsFromRoot) { len = 1; GetMemory(&WebDir, len); memcpy(WebDir, e + 1, len); len = strlen(src + 1); GetMemory(&PageAddress, len); memcpy(PageAddress, src + 1, len); } else { len = strlen(node->dir); GetMemory(&WebDir, len); memcpy(WebDir, node->dir, len); len = strlen(src); GetMemory(&PageAddress, len); memcpy(PageAddress, src, len); } } } ret = IsExistWeb(NodeHeader, WebHost, PageAddress, WebPort, WebDir); if(ret) goto __ReturnAdd; if(node->child == NULL) NewNode = node->child = (WEBNODE *)malloc(sizeof(WEBNODE)); else NodeTail->brother = NewNode = (WEBNODE *)malloc(sizeof(WEBNODE)); memset(NewNode, 0, sizeof(WEBNODE)); NewNode->host = (char *)malloc(strlen(WebHost) + 1); memset(NewNode->host, 0, strlen(WebHost) + 1); NewNode->page = (char *)malloc(strlen(PageAddress) + 1); memset(NewNode->page, 0, strlen(PageAddress) + 1); NewNode->dir = (char *)malloc(strlen(WebDir) + 1); memset(NewNode->dir, 0, strlen(WebDir) + 1); NewNode->file = (char *)malloc(MAXFILENAME + 1); memset(NewNode->file, 0, MAXFILENAME + 1); strcpy(NewNode->host, WebHost); strcpy(NewNode->page, PageAddress); strcpy(NewNode->dir, WebDir); sprintf(filename, "file%05d.html", FileNumber++); strcpy(NewNode->file, filename); NewNode->port = WebPort; NewNode->IsHandled = 0; NewNode->brother = 0; NewNode->child = 0; NodeTail = NewNode; __ReturnAdd: free(WebHost); free(PageAddress); free(WebDir); }
int main(int argc,char **argv){ int sockfd; char buffer[1024]; struct sockaddr_in server_addr; struct hostent *host; int portnumber,nbytes; char host_addr[256]; char host_file[256]; char local_file[256]; FILE *fp; char request[1024]; int send,totalsend; int i; char *pt; if(argc!=2){ fprintf(stderr,"Usage:%s web-address\a\n",argv[0]); exit (1); } printf("parameter.1 is: %s\n",argv[1]); ToLowerCase(argv[1]); printf("lowercase parameter.1 is: %s\n",argv[1]); GetHost(argv[1],host_addr,host_file,&portnumber); printf("webhost:%s\n",host_addr); printf("hostfile:%s\n",host_file); printf("portnumber:%d\n",portnumber); if((host=gethostbyname(host_addr))==NULL){ fprintf(stderr,"Gethostname error,%s\n",strerror(errno)); exit(1); } if((sockfd=socket(AF_INET,SOCK_STREAM,0))==-1){ fprintf(stderr,"SOcket Error:%s\a\n",strerror(errno)); exit(1); } bzero(&server_addr,sizeof(server_addr)); server_addr.sin_family=AF_INET; server_addr.sin_port=htons(portnumber); server_addr.sin_addr=*((struct in_addr *)host->h_addr); if(connect(sockfd,(struct sockaddr *)&server_addr,sizeof(struct sockaddr))==-1) { fprintf(stderr,"Connect Error:%s\a\n",strerror(errno)); exit(1); } sprintf(request,"GET /%s HTTP/1.1\r\nAccept:*/*\r\nAccept-language:zh-cn\r\n User-Agent:Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n Host:%s:%d\r\nConnection:Close\r\n\r\n",host_file,host_addr,portnumber); if(host_file && *host_file)pt = Rstrchr(host_file,'/'); else pt=0; memset(local_file,0,sizeof(local_file)); if(pt && *pt){ if((pt+1)&&*(pt+1))strcpy(local_file,pt+1); else memcpy(local_file,host_file,strlen(host_file)-1); } else if(host_file && *host_file)strcpy(local_file,host_file); else strcpy(local_file,"index.html"); printf("local filename to write:%s\n\n",local_file); send=0; totalsend=0; nbytes=strlen(request); while(totalsend<nbytes){ send=write(sockfd,request+totalsend,nbytes-totalsend); if(send==-1){ printf("send error!%s\n",strerror(errno)); exit(0); } totalsend+=send; printf("%d bytes send OK!\n",totalsend); } fp=fopen(local_file,"a"); if(!fp){ printf("create file error!%s\n",strerror(errno)); return 0; } printf("\nThe following is the response header:\n"); i=0; while((nbytes=read(sockfd,buffer,1))==1) if(i<4){ if(buffer[0]=='\r'||buffer[0]=='\n')i++; else i=0; printf("%c",buffer[0]); } else { fwrite(buffer,1,1,fp); i++; if(i%1024==0)fflush(fp); } fclose(fp); close(sockfd); exit(0); }