Thank Joseph M. Newcomer very much,
file divide multi segment and query download it in each thread.
"Joseph M. Newcomer" <newcomer@flounder.com> wrote in message
See below...
On Fri, 21 Nov 2008 16:26:16 +0700, "David" <thuong101277@yahoo.com>
wrote:
hi all,
I want write a programe multi thread downloading use window's functions
such
as: InternetOpen, InternetConnect, HttpOpenRequest, ...etc, but i have
problem query a segment of file from server, i try to add header request
:
****
What do you mean "multithread downloading"? Do you mean many concurrent
downloads from
many different servers, or a multithreaded single download from a single
server?
Note that multithreading will not buy you any performance improvement
because your
bottleneck is the network.
****
strHeader[1024];
_stprintf(strHeader, _T("Range: bytes=%d-\r\n"),dwStartDownload);
if(!::HttpAddRequestHeaders( _hHTTPRequest, strHeader,
_tcslen(strHeader),
HTTP_ADDREQ_FLAG_ADD)){
::InternetCloseHandle(_hHTTPRequest);
::InternetCloseHandle(_hHTTPConnection);
::InternetCloseHandle(_hHTTPSession);
return false;
}
_stprintf(strHeader, _T("Content-Length: %d\r\n"), dwSegmentSize);
if(!::HttpAddRequestHeaders( _hHTTPRequest, strHeader,
_tcslen(strHeader),
HTTP_ADDREQ_FLAG_ADD)){
::InternetCloseHandle(_hHTTPRequest);
::InternetCloseHandle(_hHTTPConnection);
::InternetCloseHandle(_hHTTPSession);
return false;
}
DWORD dwFileSizeLocal = 32040848;
****
Was this obtained by the rand() function?
****
_stprintf(strHeader, _T("Content-Range: bytes %d-%d/%d\r\n"),
dwStartDownload, dwFileSizeLocal, dwFileSizeLocal);
if(!::HttpAddRequestHeaders( _hHTTPRequest, strHeader,
_tcslen(strHeader),
HTTP_ADDREQ_FLAG_ADD)){
::InternetCloseHandle(_hHTTPRequest);
::InternetCloseHandle(_hHTTPConnection);
::InternetCloseHandle(_hHTTPSession);
return false;
}
//Sending Dwonload Request
if(!::HttpSendRequest( _hHTTPRequest, // handle by returned
HttpOpenRequest
NULL, // additional HTTP header
0, // additional HTTP header length
NULL, // additional data in HTTP Post or HTTP Put
0 // additional data length
)){
::InternetCloseHandle(_hHTTPRequest);
::InternetCloseHandle(_hHTTPConnection);
::InternetCloseHandle(_hHTTPSession);
m_lErrorCode=::GetLastError();
****
If there is a failure, the FIRST thing you do is call ::GetLastError.
Otherwise, the only
error that might be reported is the error that occurred on the last
::InternetCloseHandle.
*****
LPVOID lpMsgBuffer;
****
(a) why is this an LPVOID instead of an LPTSTR? It would save an
unnecessary cast
(b) why is this not a subroutine you call?
****
DWORD dwRet=FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
m_lErrorCode,
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
reinterpret_cast<LPTSTR>(&lpMsgBuffer),
0,
NULL);
if(lpMsgBuffer)
m_sErrorMessage = reinterpret_cast<LPTSTR>(lpMsgBuffer);
else{
m_sErrorMessage =_T("Server Request
Exception[CFXProtocolManager::RequestDownload@::HttpSendRequest()");
m_sErrorMessage.append(_T("@ErrorCode: "));
TCHAR errCode[__SIZE_SMALL_BUFFER];
****
Why are you declaring a fixed-size buffer for any purpose whatsoever
here?
****
//Convertion::int64ToString(errCode,__SIZE_SMALL_BUFFER,m_lErrorCode);
m_sErrorMessage.append(errCode);
m_sErrorMessage.append(_T("]"));
****
You have not indicated what the type of m_sErrorMessage is; if it is not
CString, why
isn't it? CString does not have an "append" method. If you are using
std::string, why?
It doesn't make sense in MFC programs to use std::string.
****
}
LocalFree(lpMsgBuffer);
if(m_IDownloadListener)
m_IDownloadListener->OnDownloadFinished(SERVER_UNAVAILABLE_CODE,m_sErrorMessage);
return false;
}
Example i have 3 segment with segment 1, segment 2 i send request ok, but
segment 3 it always fail
Anybody know this problem pls help me, thanks very much.
****
I am curious why you are trying to split a download into three segments.
Do you have any
evidence this improves either the server output rate or the network
bandwidth? Those are
your bottlenecks. This looks like you are creating a complex solution to
a simple
problem.
joe
****
Joseph M. Newcomer [MVP]
email: newcomer@flounder.com
Web: http://www.flounder.com
MVP Tips: http://www.flounder.com/mvp_tips.htm