void CHttpSocket::StartWork(void) { int ret; if (!m_inited) { return; } m_tid = new pthread_t[m_worker](); if (!m_tid) { cout << pthread_self() << ": new tid array failed" << endl; return; } NonBlockConnect(); if (m_run) { signal(SIGPIPE, SIG_IGN); FormatRequestHeader(); for (int i = 0; i < m_worker; ++i) { ret = pthread_create(&m_tid[i], NULL, CHttpSocket::DoWork, (void *)this); if (ret != 0) { cout << pthread_self() << ": create thread failed:" << strerror(errno) << endl; m_run = false; return; } cout << m_tid[i] << " is running" << endl; } } return; }
int CHttpDownLoad::UrlDownLoad() { int iRet=S_ERRO; FormatRequestHeader(); if(!Connect(m_szHost,m_wPort)) { return S_PARTDOWN; } if(!SendRequest()) return S_PARTDOWN; char szValue[30]={0}; if(GetField("Content-Length",szValue,30)==-1) { LOG((LEVEL_ERROR,"CHttpDownLoad::UrlDownLoad Not Get Content_Lenth\r\n")); return iRet; } DWORD nFileSize = atoi(szValue); if (m_dwOffset==0){ m_dwFileLen=nFileSize; } if (nFileSize==0||nFileSize>1024*1024*2){ return iRet; } //Content-Range: bytes 1000-5000/5001 memset(szValue,0,30); if(GetField("Content-Range",szValue,30)!=-1) { char *p=strstr(szValue,"/"); if (!p) { return iRet; } p++; m_dwFileLen= atoi(p); if (m_dwFileLen==0) { return iRet; } } DWORD dwRecvLen=MAXHEADERSIZE; char *pData =new char [dwRecvLen]; if (pData==NULL) { LOG((LEVEL_ERROR,"CHttpDownLoad::UrlDownLoad new pData erro:%d\r\n",GetLastError())); return iRet; } int nReceSize = 0; DWORD nCompletedSize = 0; SetFilePointer(m_hOutFileHandle,0,0,FILE_END); DWORD iWriteFileSize; while(nCompletedSize < nFileSize) { memset(pData,0,dwRecvLen); nReceSize = RecvData((LPBYTE)pData,dwRecvLen); if(nReceSize<=0){ LOG((LEVEL_ERROR,"CHttpDownLoad::UrlDownLoad- m_TcpSocket.RecvData erro :%d\r\n",WSAGetLastError())); break; } if ((DWORD)nReceSize>nFileSize-nCompletedSize){ break; } WriteFile(m_hOutFileHandle,pData,nReceSize,&iWriteFileSize,NULL); nCompletedSize += nReceSize; } delete [] pData; // if (m_dwFileLen){ // iRes=m_dwFileLen==GetFileSize(m_hOutFileHandle,0)?1:-1; // } iRet=nCompletedSize==nFileSize?S_FULLDOWN:S_PARTDOWN; return iRet; }