コード例 #1
0
ファイル: DownloadPackage.cpp プロジェクト: korman/Temp
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);
		}
	}
}
コード例 #2
0
ファイル: mail_spider.cpp プロジェクト: lumia70/unp
/**************************************************************
功能:从字符串 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;
}
コード例 #3
0
ファイル: mail_spider.cpp プロジェクト: lumia70/unp
/**************************************************************
功能:为当前节点增加子节点
***************************************************************/
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);
}
コード例 #4
0
ファイル: http.c プロジェクト: Furau/Practice
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);
}