提交 d323fce8 编写于 作者: 报告_前方高能's avatar 报告_前方高能

1.4.4-20230318

上级 1d9d1d7e
2023-03-09 ahttp 集成asynframe-sdk_v1.4.3-20230309 https://github.com/netsecsp/asynframe 2023-03-18 ahttp 集成asynframe-sdk_v1.4.4-20230318 https://github.com/netsecsp/asynframe
> asynframe-sdk_v1.4.3-202300309.zip is from https://github.com/netsecsp/asynframe > asynframe-sdk_v1.4.4-20230318.zip is from https://github.com/netsecsp/asynframe
# ahttpclient.exe # ahttpclient.exe
> supports IPv4/IPv6 http/https client program under windows > supports IPv4/IPv6 http/https client program under windows
......
...@@ -214,20 +214,6 @@ END_ASYN_IOERROR() ...@@ -214,20 +214,6 @@ END_ASYN_IOERROR()
#define OB_OsAddr ( 1 ) //OsAddr #define OB_OsAddr ( 1 ) //OsAddr
#define OB_IoArea ( 2 ) //IoArea #define OB_IoArea ( 2 ) //IoArea
/////////////////////////////////////////////////////////////////////////////////
//IThread.type
#define TT_FrameThread ( 0 ) //IAsynFrameThread
#define TT_WorksThread ( 1 ) //IThread
#define TT_TwinsThread ( 2 ) //IThread
/////////////////////////////////////////////////////////////////////////////////
//IThreadPool.type
#define TP_AutoxThreadpool ( 0 ) //自动调整线程池
#define TP_FixedThreadpool ( 1 ) //固定大小线程池
#define TP_SocksThreadpool ( 2 ) //socket 线程池
#define TP_EventThreadpool ( 3 ) //监控事件线程池
#pragma pack(push, 1) #pragma pack(push, 1)
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
typedef struct tag_OSBUFFER_IOAREA typedef struct tag_OSBUFFER_IOAREA
......
...@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NAMESPACE_BEGIN(asynsdk) NAMESPACE_BEGIN(asynsdk)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//添加到空闲的消息队列
HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0); HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0);
HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation); HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation);
...@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ...@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//枚举KeyvalSetter数据 //枚举KeyvalSetter数据
void TravelKeyvalSetter ( /*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events ); void TravelKeyvalSetter (/*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//设置读||写速度限制器 //设置读||写速度限制器
bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController); bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (/*[in ]*/IUnknown *pSocket);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//申请||释放内存 //申请||释放内存
void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size); void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size);
bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr); bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl typedef enum tag_FrameThreadCore
bool IsSslSocket (IUnknown *pSocket); {
TC_Auto = 0,
TC_Iocp,
TC_Uapc,
TC_Uapc_timeEvent,
} FrameThreadCore;
///////////////////////////////////////////////////////////////////////////////
//建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框 //建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events); void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
//创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0 //创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events); IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//创建数据传输器 //创建数据传输器
...@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM ...@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM
IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2); IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//创建线程 typedef enum tag_ThreadType
IThread *CreateThread (/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type); {
TT_FrameThread = 0, //IAsynFrameThread
TT_WorksThread, //IThread
TT_TwinsThread, //IThread
} ThreadType;
//创建Os线程
IThread *CreateThread(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadType type);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
typedef enum tag_ThreadpoolType
{
PT_AutoxThreadpool = 0, //自动调整线程池
PT_FixedThreadpool, //固定大小线程池
PT_SocksThreadpool, //socket 线程池
PT_EventThreadpool, //监控事件线程池
} ThreadpoolType;
//创建线程池 //创建线程池
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type); IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadpoolType type);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//获取frame 目录 //获取frame 目录
...@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage ...@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//转换编码格式 //转换编码格式
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst ); // XXXXX->WCHAR uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst); // XXXXX->WCHAR
uint32_t Convert( /*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); // WCHAR->XXXXX uint32_t Convert(/*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); // WCHAR->XXXXX
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); //XXXXX->XXXXX uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); //XXXXX->XXXXX
NAMESPACE_END(asynsdk) NAMESPACE_END(asynsdk)
......
#aftpx client configure file #ahttp client configure file
############################# #############################
[proxy] [proxy]
#代理配置: none/http1.1/socks4.0 4.a 5.0 #代理配置: none/http1.1/socks4.0 4.a 5.0
protocol=none protocol=none
version=1.1 version=5.0
host=127.0.0.1 host=127.0.0.1
port=8080 port=1080
user=alex user=alex
password=123456 password=123456
\ No newline at end of file
[session]
#下载限速,B/s
max_recvspeed=-1
#传输模式: 0-主动 1-被动
pasv=1
#文件名字
filename=
[account]
user=anonymous
password=IEUser@
...@@ -166,13 +166,13 @@ ...@@ -166,13 +166,13 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\Downloader.cpp" /> <ClCompile Include="..\..\src\http_Downloader.cpp" />
<ClCompile Include="..\..\src\Main.cpp" /> <ClCompile Include="..\..\src\Main.cpp" />
<ClCompile Include="..\..\src\setting.cpp" /> <ClCompile Include="..\..\src\setting.cpp" />
<ClCompile Include="..\..\src\stdafx.cpp" /> <ClCompile Include="..\..\src\stdafx.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\src\Downloader.h" /> <ClInclude Include="..\..\src\http_Downloader.h" />
<ClInclude Include="..\..\src\setting.h" /> <ClInclude Include="..\..\src\setting.h" />
<ClInclude Include="..\..\src\stdafx.h" /> <ClInclude Include="..\..\src\stdafx.h" />
</ItemGroup> </ItemGroup>
......
...@@ -163,13 +163,13 @@ ...@@ -163,13 +163,13 @@
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="..\..\src\Downloader.cpp" /> <ClCompile Include="..\..\src\http_Downloader.cpp" />
<ClCompile Include="..\..\src\Main.cpp" /> <ClCompile Include="..\..\src\Main.cpp" />
<ClCompile Include="..\..\src\setting.cpp" /> <ClCompile Include="..\..\src\setting.cpp" />
<ClCompile Include="..\..\src\stdafx.cpp" /> <ClCompile Include="..\..\src\stdafx.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="..\..\src\Downloader.h" /> <ClInclude Include="..\..\src\http_Downloader.h" />
<ClInclude Include="..\..\src\setting.h" /> <ClInclude Include="..\..\src\setting.h" />
<ClInclude Include="..\..\src\stdafx.h" /> <ClInclude Include="..\..\src\stdafx.h" />
</ItemGroup> </ItemGroup>
......
...@@ -60,7 +60,7 @@ IDR_Application ICON DISCARDABLE "exe_ahttp.ico" ...@@ -60,7 +60,7 @@ IDR_Application ICON DISCARDABLE "exe_ahttp.ico"
// //
VS_VERSION_INFO VERSIONINFO VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,4,3,3 FILEVERSION 1,4,4,4
PRODUCTVERSION 1,0,0,0 PRODUCTVERSION 1,0,0,0
FILEFLAGSMASK 0x3fL FILEFLAGSMASK 0x3fL
#ifdef _DEBUG #ifdef _DEBUG
...@@ -78,7 +78,7 @@ BEGIN ...@@ -78,7 +78,7 @@ BEGIN
BEGIN BEGIN
VALUE "CompanyName", "http://ahttp.sf.net" VALUE "CompanyName", "http://ahttp.sf.net"
VALUE "FileDescription", "ahttpclient" VALUE "FileDescription", "ahttpclient"
VALUE "FileVersion", "1, 4, 3, 3" VALUE "FileVersion", "1, 4, 4, 4"
VALUE "InternalName", "ahttpclient" VALUE "InternalName", "ahttpclient"
VALUE "LegalCopyright", "Copyright (c) netsecsp 2012-2032" VALUE "LegalCopyright", "Copyright (c) netsecsp 2012-2032"
VALUE "OriginalFilename", "ahttpclient.exe" VALUE "OriginalFilename", "ahttpclient.exe"
......
...@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -34,7 +34,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#define AAPIDLL_USING #define AAPIDLL_USING
#include "Downloader.h" #include "http_Downloader.h"
#ifdef AAPIDLL_USING #ifdef AAPIDLL_USING
#include <frame/asm/ITypedef_i.c> #include <frame/asm/ITypedef_i.c>
...@@ -59,40 +59,30 @@ STDAPI_(extern HRESULT) Initialize( /*[in ]*/IAsynMessageEvents *param1, /*[in ] ...@@ -59,40 +59,30 @@ STDAPI_(extern HRESULT) Initialize( /*[in ]*/IAsynMessageEvents *param1, /*[in ]
STDAPI_(extern HRESULT) Destory(); STDAPI_(extern HRESULT) Destory();
STDAPI_(extern InstancesManager *) GetInstancesManager(); STDAPI_(extern InstancesManager *) GetInstancesManager();
static void ShowUsage(const char *name) static void ShowUsage(std::string name)
{ {
printf("usage: %s -4/6 url [offset]\n\texample: %s -4 http[s]://www.baidu.com/index.html\n\tplease check config.txt for proxy\n\n", name, name); std::string::size_type i = name.find_last_of("/\\");
if( i != std::string::npos )
name.erase(0, i + 1);
printf(" Usage: %s [-4|6] [-s tls/1.0] [-referurl URL] [-u PROXYURL] [-c OFFSET] [-o FILE] http[s]://[user:password@]host[:port]/path/file\n", name.c_str());
printf("Options:\n");
printf(" -4 Enforce IPv4\n");
printf(" -6 Enforce IPv6\n");
printf(" -s use TLS or SSL\n");
printf(" -referurl use refer url\n");
printf(" -u use proxy url, protocol://[user:password@]host[:port]/ver?params\n");
printf(" -c continue-at OFFSET Resumed transfer OFFSET\n");
printf(" -o save FILE\n");
printf("example: %s -4 \"http://localhost/test.exe\"\n", name.c_str());
} }
int _tmain(int argc, _TCHAR *argv[]) int main(int argc, const char *argv[])
{ {
printf("Copyright (c) netsecsp 2012-2032, All rights reserved.\n"); printf("Copyright (c) netsecsp 2012-2032, All rights reserved.\n");
printf("Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated " STRING_UPDATETIME "\n"); printf("Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated " STRING_UPDATETIME "\n");
printf("http://ahttp.sf.net\n\n"); printf("http://ahttp.sf.net\n\n");
char *httpurl = "http://www.baidu.com/index.html", ipvx = '4', *pOffset = "0";
for(int i = 1; i < argc; ++ i)
{
if( strcmp(argv[i], "/?") == 0 ||
strcmp(argv[i], "--help") == 0 )
{
ShowUsage(argv[0]);
return 0;
}
if( argv[i][0] == '-' )
{
ipvx = argv[i][1];
}
else
{
if( isdigit(argv[i][0]) )
pOffset = argv[i];
else
httpurl = argv[i];
}
}
if( Initialize(NULL, NULL) != NO_ERROR ) if( Initialize(NULL, NULL) != NO_ERROR )
{ {
printf("fail to Initialize asynframe\n"); printf("fail to Initialize asynframe\n");
...@@ -110,24 +100,29 @@ int _tmain(int argc, _TCHAR *argv[]) ...@@ -110,24 +100,29 @@ int _tmain(int argc, _TCHAR *argv[])
} }
CComPtr<IAsynFrameThread> spAsynFrameThread; CComPtr<IAsynFrameThread> spAsynFrameThread;
lpInstancesManager->NewInstance(0, 0, IID_IAsynFrameThread, (void **)&spAsynFrameThread); lpInstancesManager->NewInstance(0, TC_Iocp, IID_IAsynFrameThread, (void **)&spAsynFrameThread);
HANDLE hNotify = ::CreateEvent(0, 1, 0, 0); std::unique_ptr<CHttpDownloader> downloader(new CHttpDownloader(lpInstancesManager, spAsynFrameThread));
std::unique_ptr<CDownloader> pDownloader(new CDownloader(hNotify, lpInstancesManager, spAsynFrameThread, ipvx == '4'? 2 : 23)); const char *httpurl = downloader->Parse(argc, argv);
if (pDownloader->Start(httpurl, _atoi64(pOffset))) if(!httpurl )
{
ShowUsage(argv[0]);
}
else
{ {
while( WAIT_OBJECT_0 != ::WaitForSingleObject(hNotify, 0) && if( downloader->Start(httpurl))
_kbhit() == 0 )
{ {
Sleep(100); //0.1sec while( WAIT_OBJECT_0 != ::WaitForSingleObject(downloader->m_hNotify, 0) &&
_kbhit() == 0 )
{
Sleep(100); //0.1sec
}
} }
} }
pDownloader->Shutdown(); downloader->Shutdown();
}while(0);
::CloseHandle( hNotify);
}while(0);
if( Destory() != NO_ERROR ) if( Destory() != NO_ERROR)
{ {
printf("fail to Destory asynframe\n"); printf("fail to Destory asynframe\n");
} }
......
...@@ -30,18 +30,18 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS ...@@ -30,18 +30,18 @@ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/ *****************************************************************************/
#include "stdafx.h" #include "stdafx.h"
#include "Downloader.h" #include "http_Downloader.h"
#include <frame/asm/ISsl.h> #include <frame/asm/ISsl.h>
BEGIN_ASYN_MESSAGE_MAP(CDownloader) BEGIN_ASYN_MESSAGE_MAP(CHttpDownloader)
ON_IOMSG_NOTIFY(OnIomsgNotify) ON_IOMSG_NOTIFY(OnIomsgNotify)
ON_EVENT_NOTIFY(OnEventNotify, IAsynIoOperation) ON_EVENT_NOTIFY(OnEventNotify, IAsynIoOperation)
ON_QUERY_RESULT(OnQueryResult, IUnknown) ON_QUERY_RESULT(OnQueryResult, IUnknown)
END_ASYN_MESSAGE_MAP() END_ASYN_MESSAGE_MAP()
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown **objects ) HRESULT CHttpDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown **objects )
{ {
if( lParam1 == 0 ) if(!lParam1 )
{ {
asynsdk::CStringSetter d(1); asynsdk::CStringSetter d(1);
asynsdk::CMemorySetter c((void*)0); asynsdk::CMemorySetter c((void*)0);
...@@ -49,8 +49,7 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown ...@@ -49,8 +49,7 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown
((IKeyvalSetter*)objects[0])->Get(STRING_from_string(";context"), 0, 0, &c); ((IKeyvalSetter*)objects[0])->Get(STRING_from_string(";context"), 0, 0, &c);
if( d.m_val.rfind("cert.verify") != std::string::npos ) if( d.m_val.rfind("cert.verify") != std::string::npos )
{// cert.verify {// cert.verify
ISsl *pSsl = (ISsl*)lParam2; return ((ISsl*)lParam2)->VerifyPeerCertificate(*(handle*)c.m_val.ptr, 0x1000);
return pSsl->VerifyPeerCertificate(*(handle*)c.m_val.ptr, 0x1000);
} }
return E_NOTIMPL; return E_NOTIMPL;
} }
...@@ -68,10 +67,10 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown ...@@ -68,10 +67,10 @@ HRESULT CDownloader::OnQueryResult( uint64_t lParam1, uint64_t lParam2, IUnknown
if( bCompleted ) m_datasize = 0; //mark download complete if( bCompleted ) m_datasize = 0; //mark download complete
return m_datasize != 0 ? S_OK : S_FALSE; return m_datasize != 0? S_OK : S_FALSE;
} }
HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation ) HRESULT CHttpDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{ {
uint32_t lErrorCode = NO_ERROR, lTransferedBytes; uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0); lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
...@@ -88,23 +87,22 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO ...@@ -88,23 +87,22 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
} }
else else
{ {
std::string host; asynsdk::CStringSetterRef temp(1, &host); asynsdk::CStringSetter host(1);
PORT port; PORT port;
{// 打印链接信息 {// 打印链接信息
CComPtr<IAsynNetIoOperation> spAsynIoOperation; CComPtr<IAsynNetIoOperation> spAsynIoOperation;
lpAsynIoOperation->QueryInterface(IID_IAsynNetIoOperation, (void **)&spAsynIoOperation); lpAsynIoOperation->QueryInterface(IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
spAsynIoOperation->GetPeerAddress(&temp, 0, &port, &m_af); spAsynIoOperation->GetPeerAddress(&host, 0, &port, &m_af);
printf("connected %s:%d[%s]\n", host.c_str(), port, m_af == AF_INET ? "ipv4" : "ipv6"); printf("connected %s:%d[%s]\n", host.m_val.c_str(), port, m_af == AF_INET ? "ipv4" : "ipv6");
} }
asynsdk::CKeyvalSetter params(1); asynsdk::CKeyvalSetter params(1);
//params.Set(STRING_from_string("User-Agent"), 1, STRING_from_string("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)")); //params.Set(STRING_from_string("User-Agent"), 1, STRING_from_string("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"));
params.Set(STRING_from_string("Accept" ), 1, STRING_from_string("*/*")); params.Set(STRING_from_string("Accept" ), 1, STRING_from_string("*/*"));
const std::string &szreferurl = m_setsfile.get_string("session", "referurl"); if( m_referurl ) params.Set(STRING_from_string("Referer"), 1, STRING_from_string(m_referurl));
if( szreferurl.empty() == false ) params.Set(STRING_from_string("Referer"), 1, STRING_from_string(szreferurl));
if( m_startpos != 0 ) if( m_startpos )
{ {
char temp[64]; sprintf_s(temp, 64, "bytes=%I64d-", m_startpos); char temp[64]; sprintf_s(temp, 64, "bytes=%I64d-", m_startpos);
params.Set(STRING_from_string("Range" ), 1, STRING_from_string(temp)); params.Set(STRING_from_string("Range" ), 1, STRING_from_string(temp));
...@@ -169,7 +167,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO ...@@ -169,7 +167,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
} }
} }
if( m_datasize == 0 ) //filesize is zero if( m_datasize == 0 ) //filesize is zero
{ {
printf("%s is zero\n", m_filename.c_str()); printf("%s is zero\n", m_filename.c_str());
SetEvent(m_hNotify); SetEvent(m_hNotify);
...@@ -228,7 +226,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO ...@@ -228,7 +226,7 @@ HRESULT CDownloader::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoO
return E_NOTIMPL; //通知系统释放lpAsynIoOperation return E_NOTIMPL; //通知系统释放lpAsynIoOperation
} }
HRESULT CDownloader::OnEventNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation ) HRESULT CHttpDownloader::OnEventNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation )
{ {
if( m_spAsynIoBridge != (IAsynIoBridge *)lParam1) return S_OK; if( m_spAsynIoBridge != (IAsynIoBridge *)lParam1) return S_OK;
......
#ifndef __DOWNLOADER_H__ #ifndef __HTTPDOWNLOADER_H__
#define __DOWNLOADER_H__ #define __HTTPDOWNLOADER_H__
/***************************************************************************** /*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved. Copyright (c) netsecsp 2012-2032, All rights reserved.
...@@ -38,42 +38,236 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -38,42 +38,236 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#include "setting.h" #include "setting.h"
using namespace asynsdk; using namespace asynsdk;
class CDownloader : public asyn_message_events_impl class CHttpDownloader : public asyn_message_events_impl
{ {
public: public:
CDownloader(HANDLE hNotify, InstancesManager *lpInstanceManager, IAsynFrameThread *lpAsynFrameThread, uint32_t af = AF_INET) CHttpDownloader(InstancesManager *lpInstanceManager, IAsynFrameThread *lpAsynFrameThread)
: m_af(af), m_hNotify(hNotify), m_setsfile("config.txt") : m_setsfile("proxy.txt"), m_af(AF_INET), m_startpos(0), m_hNotify(::CreateEvent(0, 1, 0, 0))
{ {
m_spInstanceManager = lpInstanceManager; m_spInstanceManager = lpInstanceManager;
m_spAsynFrameThread = lpAsynFrameThread; m_spAsynFrameThread = lpAsynFrameThread;
m_spInstanceManager->GetInstance(STRING_from_string(IN_AsynNetwork), IID_IAsynNetwork, (void **)&m_spAsynNetwork); m_spInstanceManager->GetInstance(STRING_from_string(IN_AsynNetwork), IID_IAsynNetwork, (void **)&m_spAsynNetwork);
CreateAsynFrame(m_spAsynFrameThread, 0, &m_spAsynFrame); CreateAsynFrame(m_spAsynFrameThread, 0, &m_spAsynFrame);
} }
virtual ~CHttpDownloader()
{
CloseHandle(m_hNotify);
}
public: // interface of asyn_message_events_impl public: // interface of asyn_message_events_impl
DECLARE_ASYN_MESSAGE_MAP(CDownloader) DECLARE_ASYN_MESSAGE_MAP(CHttpDownloader)
HRESULT OnIomsgNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation ); HRESULT OnIomsgNotify( uint64_t lParam1, uint64_t lParam2, IAsynIoOperation *lpAsynIoOperation );
HRESULT OnEventNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation ); HRESULT OnEventNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation );
HRESULT OnQueryResult( uint64_t lParam1, uint64_t lAction, IUnknown **objects ); HRESULT OnQueryResult( uint64_t lParam1, uint64_t lAction, IUnknown **objects );
public: public:
bool Start(const std::string &url, uint64_t startpos) const char *Parse(int argc, const char *argv[])
{ {
//url格式, protocol://[user:password@]host[:port]/path/[;parameters][?query]#fragment const char *httpurl = 0;
for(int i = 1; i < argc; ++ i)
{
if( strcmp(argv[i], "/?") == 0 ||
strcmp(argv[i], "--help") == 0 )
{
httpurl = 0;
break;
}
if( argv[i][0] == '-' )
{
if( strcmp(argv[i], "-referurl") == 0 )
{
if( argc > ++ i)
m_referurl = argv[i];
continue;
}
if( strcmp(argv[i], "-4") == 0 )
{
m_af = AF_INET;
continue;
}
if( strcmp(argv[i], "-6") == 0 )
{
m_af = 23;
continue;
}
if( strcmp(argv[i], "-c") == 0 )
{
if( argc > ++ i)
m_startpos = _atoi64(argv[i]);
continue;
}
if( strcmp(argv[i], "-s") == 0 )
{
if( argc > ++ i)
m_setsfile.set_string("ssl", "algo", argv[i]);
continue;
}
if( strcmp(argv[i], "-o") == 0 )
{
if( argc > ++ i)
m_savename = argv[i];
continue;
}
if( strcmp(argv[i], "-u") == 0 )
{
if( argc > ++ i)
{// protocol://[user:password@]host[:port]/ver?params
std::string tmpurl = argv[i];
std::string::size_type pos1 = tmpurl.find("://");
if( pos1 == std::string::npos )
{
continue;
}
std::string schema = tmpurl.substr(0, pos1);
_strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" &&
schema != "socks" )
{
continue;
}
else
{
pos1 += 3;
}
m_setsfile.set_string("proxy", "protocol", schema);
std::string::size_type pos2 = tmpurl.find('/', pos1);
std::string hostport; //[user:password@]host[:port]
if( pos2 == std::string::npos )
{
hostport = tmpurl.substr(pos1);
}
else
{// ver?params
hostport = tmpurl.substr(pos1, pos2 - pos1);
pos2 += 1;
std::string::size_type post = tmpurl.find_first_of("?=", pos2);
if( post == std::string::npos )
{
m_setsfile.set_string("proxy", "version", tmpurl.substr(pos2));
}
else
{
std::string params;
if( tmpurl[post] != '?' )
{
params = tmpurl.substr(pos2);
}
else
{
params = tmpurl.substr(post + 1);
m_setsfile.set_string("proxy", "version", tmpurl.substr(pos2, post - pos2));
}
std::string::size_type poss = params.find("method=");
if( poss != std::string::npos )
{
poss += 7;
std::string::size_type pose = params.find('&');
if( pose == std::string::npos )
{
m_setsfile.set_string("proxy", "method", params.substr(poss));
}
else
{
m_setsfile.set_string("proxy", "method", params.substr(poss, pose - poss));
}
}
}
}
std::string::size_type pos3 = hostport.find('@');
if( pos3 != std::string::npos )
{
std::string account = hostport.substr(0, pos3);
hostport.erase(0, pos3 + 1);
std::string::size_type post = account.find(':');
if( post == std::string::npos )
{
m_setsfile.set_string("proxy", "user", account);
}
else
{
m_setsfile.set_string("proxy", "user", account.substr(0, post));
m_setsfile.set_string("proxy", "password", account.substr(post + 1));
}
}
std::string::size_type pos4 = hostport.find(':');
if( pos4 == std::string::npos )
{
m_setsfile.set_string("proxy", "host", hostport);
}
else
{
m_setsfile.set_string("proxy", "host", hostport.substr(0, pos4));
m_setsfile.set_string("proxy", "port", hostport.substr(pos4 + 1));
}
}
continue;
}
}
else
{
std::string tmpurl = argv[i];
std::string::size_type pos1 = tmpurl.find("://");
if( pos1 == std::string::npos )
{
continue;
}
std::string schema = tmpurl.substr(0, pos1);
_strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" &&
schema != "https" &&
schema != "ftp" &&
schema != "ftps" )
{
continue;
}
else
{
httpurl = argv[i];
}
}
}
return httpurl;
}
bool Start(std::string url)
{// url格式, protocol://[user:password@]host[:port]/path/[;parameters][?query]#fragment
m_spInstanceManager->NewInstance(0, 0, IID_ISpeedController, (void **)&m_spSpeedController);
std::string::size_type pos1 = url.find("://"); std::string::size_type pos1 = url.find("://");
if( pos1 == std::string::npos ) if( pos1 == std::string::npos )
{ {
printf("fail to parse %s\n", url.c_str()); printf("fail to parse %s\n", url.c_str());
return false; return false;
} }
std::string schema = url.substr(0, pos1); std::string schema = url.substr(0, pos1);
pos1 += 3/*skip "://" */;
_strlwr_s((char*)schema.c_str(), schema.size() + 1); _strlwr_s((char*)schema.c_str(), schema.size() + 1);
if( schema != "http" && schema != "https" && schema != "ftp" && schema != "ftps" ) if( schema != "http" &&
schema != "https" &&
schema != "ftp" &&
schema != "ftps" )
{ {
printf("invalid schema: %s\n", url.c_str()); printf("fail to parse %s\n", url.c_str());
return false; return false;
} }
else
{
pos1 += 3;
}
std::string::size_type pos2 = url.find('/', pos1); std::string::size_type pos2 = url.find('/', pos1);
...@@ -88,26 +282,24 @@ public: ...@@ -88,26 +282,24 @@ public:
hostport = url.substr(pos1, pos2 - pos1); hostport = url.substr(pos1, pos2 - pos1);
std::string::size_type pos3 = url.find_first_of(";?#", pos2 + 1); std::string::size_type pos3 = url.find_first_of(";?#", pos2 + 1);
m_filepath = pos3 == std::string::npos ? url.substr(pos2) : url.substr(pos2, pos3 - pos2); m_filepath = pos3 == std::string::npos? url.substr(pos2) : url.substr(pos2, pos3 - pos2);
std::string::size_type pos4 = m_filepath.rfind('/'); std::string::size_type pos4 = m_filepath.rfind('/');
m_filename = m_filepath.substr(pos4 + 1); m_filename = m_filepath.substr(pos4 + 1);
} }
if( m_filename.empty()) m_filename = "index.html"; if( m_filename.empty())
m_filename = "index.html";
std::string::size_type pos3 = hostport.find('@'); std::string::size_type pos3 = hostport.find('@');
if( pos3 == std::string::npos ) if( pos3 != std::string::npos )
{
pos3 = 0;
}
else
{ {
pos3 += 1; hostport.erase(0, pos3 + 1);
} }
std::string::size_type pos4 = hostport.find(':', pos3);
std::string::size_type pos4 = hostport.find(':');
if( pos4 == std::string::npos ) if( pos4 == std::string::npos )
{ {
m_host = hostport.substr(pos3); m_host = hostport;
m_port = 80; m_port = 80;
if( schema == "https") m_port = 443; if( schema == "https") m_port = 443;
if( schema == "ftp" ) m_port = 21; if( schema == "ftp" ) m_port = 21;
...@@ -115,12 +307,12 @@ public: ...@@ -115,12 +307,12 @@ public:
} }
else else
{ {
m_host = hostport.substr(pos3, pos4 - pos3); m_host = hostport.substr(0, pos4);
m_port = atoi(hostport.substr(pos4 + 1).c_str()); m_port = (PORT)atoi(hostport.substr(pos4 + 1).c_str());
} }
m_startpos = startpos; if( m_savename.empty())
m_savename = m_setsfile.get_string("session", "filename", m_filename); m_savename = m_filename;
std::string proxyname = m_setsfile.get_string("proxy", "protocol", "none"); std::string proxyname = m_setsfile.get_string("proxy", "protocol", "none");
if( proxyname != "none" && if( proxyname != "none" &&
...@@ -137,7 +329,7 @@ public: ...@@ -137,7 +329,7 @@ public:
CComPtr<IAsynRawSocket> spAsynPtlSocket; CComPtr<IAsynRawSocket> spAsynPtlSocket;
if( proxyname == "none" ) if( proxyname == "none" )
{// 没有配置代理的情况: non {// 没有配置代理的情况: non
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("http"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(schema == "http" || schema == "ftp"? ("tcp/1.1") : (schema == "ftps"? "tls/1.1" : "ssl/1.1")/*tcp:表示http/ftp ssl:表示https/ftps*/), &spAsynPtlSocket); m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("http"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(schema == "http" || schema == "ftp"? "tcp" : m_setsfile.get_string("ssl", "algo", "tls/1.0")), &spAsynPtlSocket);
if( spAsynPtlSocket == NULL ) if( spAsynPtlSocket == NULL )
{ {
printf("can't load plugin: http\n"); printf("can't load plugin: http\n");
...@@ -150,11 +342,11 @@ public: ...@@ -150,11 +342,11 @@ public:
{// http.proxy {// http.proxy
if( memcmp(schema.c_str(), "http", 4) == 0 ) if( memcmp(schema.c_str(), "http", 4) == 0 )
{ {
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string( schema + "/" + m_setsfile.get_string("proxy", "version")), &spAsynPtlSocket ); m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string( schema + "/" + m_setsfile.get_string("proxy", "version", "1.1")), &spAsynPtlSocket );
} }
else else
{ {
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version")), &spAsynPtlSocket ); m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version", "1.1")), &spAsynPtlSocket );
} }
if( spAsynPtlSocket == NULL ) if( spAsynPtlSocket == NULL )
{ {
...@@ -169,7 +361,7 @@ public: ...@@ -169,7 +361,7 @@ public:
asynsdk::CKeyvalSetter params(1); asynsdk::CKeyvalSetter params(1);
params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password"))); params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password")));
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), schema!="https"? (PORT)m_setsfile.get_long("proxy", "port", 8080) : (PORT)m_setsfile.get_long("proxy", "port_2", 8443), STRING_EX::null, &params); HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), schema!="https"? (PORT)m_setsfile.get_long("proxy", "port", 8080) : (PORT)m_setsfile.get_long("proxy", "port", 8443), STRING_from_string(m_setsfile.get_string("proxy", "method", "")), &params);
} }
else else
{// socks.proxy {// socks.proxy
...@@ -180,7 +372,7 @@ public: ...@@ -180,7 +372,7 @@ public:
} }
CComPtr<IAsynRawSocket> spAsynTmpSocket; CComPtr<IAsynRawSocket> spAsynTmpSocket;
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version")), &spAsynTmpSocket ); m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("proxy"), (IUnknown **)&spAsynInnSocket.p, STRING_from_string(proxyname + "/" + m_setsfile.get_string("proxy", "version", "5.0")), &spAsynTmpSocket );
if( spAsynTmpSocket == NULL ) if( spAsynTmpSocket == NULL )
{ {
printf("can't load plugin: proxy.%s\n", proxyname.c_str()); printf("can't load plugin: proxy.%s\n", proxyname.c_str());
...@@ -192,9 +384,9 @@ public: ...@@ -192,9 +384,9 @@ public:
asynsdk::CKeyvalSetter params(1); asynsdk::CKeyvalSetter params(1);
params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password"))); params.Set(STRING_from_string(";account"), 1, STRING_from_string(m_setsfile.get_string("proxy", "user") + ":" + m_setsfile.get_string("proxy", "password")));
HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), (PORT)m_setsfile.get_long("proxy", "port", 1080), STRING_EX::null, &params); HRESULT hr = spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), (PORT)m_setsfile.get_long("proxy", "port", 1080), STRING_from_string(m_setsfile.get_string("proxy", "method", "")), &params);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown **)&spAsynTmpSocket.p, STRING_from_string(schema=="http"? "tcp/1.1" : "ssl/1.1"), &spAsynPtlSocket ); m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown **)&spAsynTmpSocket.p, STRING_from_string(schema=="http"? "tcp/1.1" : m_setsfile.get_string("ssl", "algo", "tls/1.0")), &spAsynPtlSocket );
if( spAsynPtlSocket == NULL ) if( spAsynPtlSocket == NULL )
{ {
printf("can't load plugin: http\n"); printf("can't load plugin: http\n");
...@@ -203,23 +395,28 @@ public: ...@@ -203,23 +395,28 @@ public:
} }
} }
spAsynPtlSocket->QueryInterface(IID_IAsynTcpSocket, (void **)&m_spAsynTcpSocket);
//设置接收数据速度: B/s //设置接收数据速度: B/s
m_spInstanceManager->NewInstance(0, 0, IID_ISpeedController, (void **)&m_spSpeedController); asynsdk::SetSpeedController(spAsynPtlSocket, Io_recv, -1, m_spSpeedController);
m_spSpeedController->SetMaxSpeed(m_setsfile.get_long("session", "max_recvspeed", -1));
bool ret = asynsdk::SetSpeedController(m_spAsynTcpSocket, Io_recv, -1, m_spSpeedController);
spAsynPtlSocket->QueryInterface(IID_IAsynTcpSocket, (void **)&m_spAsynTcpSocket);
m_spAsynTcpSocket->Open(m_spAsynFrameThread, m_af, SOCK_STREAM, IPPROTO_TCP); m_spAsynTcpSocket->Open(m_spAsynFrameThread, m_af, SOCK_STREAM, IPPROTO_TCP);
//开始连接... //开始连接...
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
m_spAsynNetwork->CreateAsynIoOperation(m_spAsynFrame, m_af, 0, IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
if( proxyname == "none" ) if( proxyname == "none" )
{
printf("start to connect %s:%d\n", m_host.c_str(), m_port); printf("start to connect %s:%d\n", m_host.c_str(), m_port);
}
else else
printf("start to connect %s:%d via %s-proxyserver[%s:%d]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str(), m_setsfile.get_long("proxy", "port", 1080)); {
const PORT port = (PORT)m_setsfile.get_long("proxy", "port", 0);
if( port )
printf("start to connect %s:%d via %s-proxyserver[%s:%d]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str(), port);
else
printf("start to connect %s:%d via %s-proxyserver[%s]\n", m_host.c_str(), m_port, proxyname.c_str(), m_setsfile.get_string("proxy", "host", "127.0.0.1").c_str());
}
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
m_spAsynNetwork->CreateAsynIoOperation(m_spAsynFrame, 0, 0, IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
m_spAsynTcpSocket->Connect(STRING_from_string(m_host), m_port, 0, spAsynIoOperation, m_setsfile.get_long("session", "connect_timeout", 2000/*2sec*/)); m_spAsynTcpSocket->Connect(STRING_from_string(m_host), m_port, 0, spAsynIoOperation, m_setsfile.get_long("session", "connect_timeout", 2000/*2sec*/));
return true; return true;
} }
...@@ -235,7 +432,6 @@ protected: ...@@ -235,7 +432,6 @@ protected:
CComPtr<IAsynFrameThread> m_spAsynFrameThread; CComPtr<IAsynFrameThread> m_spAsynFrameThread;
CComPtr<IAsynFrame > m_spAsynFrame; CComPtr<IAsynFrame > m_spAsynFrame;
CComPtr<IAsynNetwork > m_spAsynNetwork; CComPtr<IAsynNetwork > m_spAsynNetwork;
HANDLE m_hNotify;
CComPtr<ISpeedController> m_spSpeedController; CComPtr<ISpeedController> m_spSpeedController;
uint32_t m_starttime; uint32_t m_starttime;
...@@ -247,12 +443,16 @@ protected: ...@@ -247,12 +443,16 @@ protected:
std::string m_host; std::string m_host;
PORT m_port; PORT m_port;
const char *m_referurl;
setting m_setsfile; setting m_setsfile;
std::string m_filename; std::string m_filename;
std::string m_filepath; std::string m_filepath;
std::string m_savename; std::string m_savename;
uint64_t m_datasize; //尚未接收数据的长度 uint64_t m_datasize; //尚未接收数据的长度
uint64_t m_startpos; //从0开始 uint64_t m_startpos; //从0开始
public:
HANDLE m_hNotify;
}; };
#endif//__DOWNLOADER_H__ #endif//__HTTPDOWNLOADER_H__
...@@ -214,20 +214,6 @@ END_ASYN_IOERROR() ...@@ -214,20 +214,6 @@ END_ASYN_IOERROR()
#define OB_OsAddr ( 1 ) //OsAddr #define OB_OsAddr ( 1 ) //OsAddr
#define OB_IoArea ( 2 ) //IoArea #define OB_IoArea ( 2 ) //IoArea
/////////////////////////////////////////////////////////////////////////////////
//IThread.type
#define TT_FrameThread ( 0 ) //IAsynFrameThread
#define TT_WorksThread ( 1 ) //IThread
#define TT_TwinsThread ( 2 ) //IThread
/////////////////////////////////////////////////////////////////////////////////
//IThreadPool.type
#define TP_AutoxThreadpool ( 0 ) //自动调整线程池
#define TP_FixedThreadpool ( 1 ) //固定大小线程池
#define TP_SocksThreadpool ( 2 ) //socket 线程池
#define TP_EventThreadpool ( 3 ) //监控事件线程池
#pragma pack(push, 1) #pragma pack(push, 1)
///////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////
typedef struct tag_OSBUFFER_IOAREA typedef struct tag_OSBUFFER_IOAREA
......
...@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ...@@ -41,6 +41,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
NAMESPACE_BEGIN(asynsdk) NAMESPACE_BEGIN(asynsdk)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//添加到空闲的消息队列
HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0); HRESULT AppendIdleOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ]*/uint32_t param2 = 0);
HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation); HRESULT SendAsynIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation);
...@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in ...@@ -53,27 +54,35 @@ HRESULT PostBindIoOperation(/*[in ]*/IAsynIoOperation *lpAsynIoOperation, /*[in
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//枚举KeyvalSetter数据 //枚举KeyvalSetter数据
void TravelKeyvalSetter ( /*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events ); void TravelKeyvalSetter (/*[in ]*/IKeyvalSetter *object, /*[in ]*/IAsynMessageEvents *events);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//设置读||写速度限制器 //设置读||写速度限制器
bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController); bool SetSpeedController (/*[in ]*/IAsynIoDevice *lpDstAsynIoDevice, /*[in ]*/uint32_t type, /*[in ]*/uint32_t level, /*[in ]*/ISpeedController *pSpeedController);
///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl
bool IsSslSocket (/*[in ]*/IUnknown *pSocket);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//申请||释放内存 //申请||释放内存
void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size); void *AcquireBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in, out]*/uint32_t *size);
bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr); bool ReleaseBuffer(/*[in ]*/IMemoryPool *lpMemorypool, /*[in ]*/void *addr);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//检测是否ISsl typedef enum tag_FrameThreadCore
bool IsSslSocket (IUnknown *pSocket); {
TC_Auto = 0,
TC_Iocp,
TC_Uapc,
TC_Uapc_timeEvent,
} FrameThreadCore;
///////////////////////////////////////////////////////////////////////////////
//建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框 //建立消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 不能用于模态对话框
void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events); void DoMessageLoop(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
//创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0 //创建消息循环泵: pParam1==0表示建立异步线程循环泵, 禁止events=0,pParam1!=0表示建立窗口线程循环泵, 允许events=0, 注意: 可以用于模态对话框, 必须在当前线程创建/运行线程循环泵, 并且禁止events=0
IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/uint32_t unused, /*[in ]*/IAsynMessageEvents *events); IThreadMessagePump *CreateThreadMessagePump(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/handle pParam1, /*[in ]*/FrameThreadCore core, /*[in ]*/IAsynMessageEvents *events);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//创建数据传输器 //创建数据传输器
...@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM ...@@ -84,12 +93,25 @@ IDataTransmit *CreateDataTransmit(/*[in ]*/InstancesManager *lpInstancesM
IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2); IOsCommand *CreateCommand(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/IUnknown *thread, /*[in ]*/IUnknown *pParam1, /*[in ]*/uint64_t lparam2);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//创建线程 typedef enum tag_ThreadType
IThread *CreateThread (/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type); {
TT_FrameThread = 0, //IAsynFrameThread
TT_WorksThread, //IThread
TT_TwinsThread, //IThread
} ThreadType;
//创建Os线程
IThread *CreateThread(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadType type);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
typedef enum tag_ThreadpoolType
{
PT_AutoxThreadpool = 0, //自动调整线程池
PT_FixedThreadpool, //固定大小线程池
PT_SocksThreadpool, //socket 线程池
PT_EventThreadpool, //监控事件线程池
} ThreadpoolType;
//创建线程池 //创建线程池
IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/uint32_t type); IThreadPool *CreateThreadPool(/*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/const char *name, /*[in ]*/ThreadpoolType type);
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//获取frame 目录 //获取frame 目录
...@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage ...@@ -97,9 +119,9 @@ std::string GetFrameFolderDirectory(/*[in ]*/InstancesManager *lpInstancesManage
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//转换编码格式 //转换编码格式
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst ); // XXXXX->WCHAR uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*out*/std::wstring &dst); // XXXXX->WCHAR
uint32_t Convert( /*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); // WCHAR->XXXXX uint32_t Convert(/*[in ]*/const wchar_t *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); // WCHAR->XXXXX
uint32_t Convert( /*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst ); //XXXXX->XXXXX uint32_t Convert(/*[in ]*/uint32_t nSrcCodepage, /*[in ]*/const char *src, /*[in ]*/uint32_t len, /*[in ]*/uint32_t nDstCodepage, /*out*/std::string &dst); //XXXXX->XXXXX
NAMESPACE_END(asynsdk) NAMESPACE_END(asynsdk)
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册