예제 #1
0
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;
}
예제 #2
0
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;

}