提交 96718657 编写于 作者: Y yangshengqian

1.3-20221102

上级 dc5baa1e
......@@ -29,7 +29,7 @@ asynframe framework解决上面所提的软件产品开发过程中的六大问
6. 引用计数管理对象内存
7. 支持微秒级定时器
8. 集成[Log4cplus](https://github.com/log4cplus/log4cplus),统一模块输出日志
![](https://github.com/netsecsp/asynframe/blob/master/img/01_asynframe.jpg)
![image](https://netsecsp.github.io/img/01_asynframe.jpg)
**开发优势:**
1. 支持可升级的插件化,协助windows产品模块化。
......@@ -109,22 +109,22 @@ int main(int argc, const char *argv[])
```
# 开发
- asynframe framework [导出函数](/doc/pluginapi.md)
- asynframe framework [导出函数](https://netsecsp.github.io/doc/pluginapi.md)
- 接口定义
[IAsynFrame](/doc/IAsynFrame.txt)
[IAsynFileSystem](/doc/IAsynFileSystem.txt)
[IAsynIpcChannel](/doc/IAsynIpcChannel.txt)
[IAsynNetwork](/doc/IAsynNetwork.txt)
[IAsynNetAgent](/doc/IAsynNetAgent.txt)
[IConsole](/doc/IConsole.txt)
[IExceptionTrapper](/doc/IExceptionTrapper.txt)
[INet](/doc/INet.txt)
[IProxy](/doc/IProxy.txt)
[ISsl](/doc/ISsl.txt)
[IVmHost](/doc/IVmHost.txt)
- [插件使用](/doc/externapi.md)
[IAsynFrame](https://netsecsp.github.io/doc/IAsynFrame.txt)
[IAsynFileSystem](https://netsecsp.github.io/doc/IAsynFileSystem.txt)
[IAsynIpcChannel](https://netsecsp.github.io/doc/IAsynIpcChannel.txt)
[IAsynNetwork](https://netsecsp.github.io/doc/IAsynNetwork.txt)
[IAsynNetAgent](https://netsecsp.github.io/doc/IAsynNetAgent.txt)
[IConsole](https://netsecsp.github.io/doc/IConsole.txt)
[IExceptionTrapper](https://netsecsp.github.io/doc/IExceptionTrapper.txt)
[INet](https://netsecsp.github.io/doc/INet.txt)
[IProxy](https://netsecsp.github.io/doc/IProxy.txt)
[ISsl](https://netsecsp.github.io/doc/ISsl.txt)
[IVmHost](https://netsecsp.github.io/doc/IVmHost.txt)
- [插件使用](https://netsecsp.github.io/doc/externapi.md)
<u>基础模块</u>
- asyncore
......@@ -136,19 +136,19 @@ int main(int argc, const char *argv[])
<u>网络模块</u>
- asynneta
- dtp
- [dns](/doc/dns.md)
- [ftp](/doc/ftp.md)
- [http](/doc/http.md)
- [rtsp](/doc/rtsp.md)
- [proxy](/doc/proxy.md)
- [ssl](/doc/ssl.md)
- [websocket](/doc/websocket.md)
- [dns](https://netsecsp.github.io/doc/dns.md)
- [ftp](https://netsecsp.github.io/doc/ftp.md)
- [http](https://netsecsp.github.io/doc/http.md)
- [rtsp](https://netsecsp.github.io/doc/rtsp.md)
- [proxy](https://netsecsp.github.io/doc/proxy.md)
- [ssl](https://netsecsp.github.io/doc/ssl.md)
- [websocket](https://netsecsp.github.io/doc/websocket.md)
<u>扩展模块</u>
- [console](/doc/console.md)
- [lua](/doc/lua.md)
- [zip](/doc/zip.md)
- [sqlite](/doc/sqlite.md)
- [console](https://netsecsp.github.io/doc/console.md)
- [lua](https://netsecsp.github.io/doc/lua.md)
- [zip](https://netsecsp.github.io/doc/zip.md)
- [sqlite](https://netsecsp.github.io/doc/sqlite.md)
# 鸣谢
> [Log4cplus](https://github.com/log4cplus/log4cplus)
......
......@@ -29,7 +29,7 @@ Asynframe framework solves the six problems mentioned above in the process of so
6. Reference count management object memory
7. Provide microsecond timer
8. Integrate [Log4cplus](https://github.com/log4cplus/log4cplus),Unified modules output log
![](https://github.com/netsecsp/asynframe/blob/master/img/01_asynframe.jpg)
![image](https://netsecsp.github.io/img/01_asynframe.jpg)
**Development advantage:**
1. Support the upgradable plug-in and assist the modularization of windows products.
......@@ -62,7 +62,7 @@ Asynframe framework solves the six problems mentioned above in the process of so
# Change log
> 2022/11/02 Release asynframe framework v1.3
1. Crash explorer implements cross process output of stack information and dmp files when crashing
1. Crash explorer implements cross process output of stack information and dmp file when crashing
2. SSL fixes compatibility issues
3. Support plug-in hot upgrade
> 2022/06/08 Release asynframe framework v1.2
......@@ -109,22 +109,22 @@ int main(int argc, const char *argv[])
```
# Development
- [asynframe framework export functions](/doc/pluginapi.md)
- [asynframe framework export functions](https://netsecsp.github.io/doc/pluginapi.md)
- Interface
[IAsynFrame](/doc/IAsynFrame.txt)
[IAsynFileSystem](/doc/IAsynFileSystem.txt)
[IAsynIpcChannel](/doc/IAsynIpcChannel.txt)
[IAsynNetwork](/doc/IAsynNetwork.txt)
[IAsynNetAgent](/doc/IAsynNetAgent.txt)
[IConsole](/doc/IConsole.txt)
[IExceptionTrapper](/doc/IExceptionTrapper.txt)
[INet](/doc/INet.txt)
[IProxy](/doc/IProxy.txt)
[ISsl](/doc/ISsl.txt)
[IVmHost](/doc/IVmHost.txt)
- [Plugins](/doc/externapi.md)
[IAsynFrame](https://netsecsp.github.io/doc/IAsynFrame.txt)
[IAsynFileSystem](https://netsecsp.github.io/doc/IAsynFileSystem.txt)
[IAsynIpcChannel](https://netsecsp.github.io/doc/IAsynIpcChannel.txt)
[IAsynNetwork](https://netsecsp.github.io/doc/IAsynNetwork.txt)
[IAsynNetAgent](https://netsecsp.github.io/doc/IAsynNetAgent.txt)
[IConsole](https://netsecsp.github.io/doc/IConsole.txt)
[IExceptionTrapper](https://netsecsp.github.io/doc/IExceptionTrapper.txt)
[INet](https://netsecsp.github.io/doc/INet.txt)
[IProxy](https://netsecsp.github.io/doc/IProxy.txt)
[ISsl](https://netsecsp.github.io/doc/ISsl.txt)
[IVmHost](https://netsecsp.github.io/doc/IVmHost.txt)
- [Plugins](https://netsecsp.github.io/doc/externapi.md)
<u>base modules</u>
- asyncore
- asynfile
......@@ -135,19 +135,19 @@ int main(int argc, const char *argv[])
<u>network modules</u>
- asynneta
- dtp
- [dns](/doc/dns.md)
- [ftp](/doc/ftp.md)
- [http](/doc/http.md)
- [rtsp](/doc/rtsp.md)
- [proxy](/doc/proxy.md)
- [ssl](/doc/ssl.md)
- [websocket](/doc/websocket.md)
- [dns](https://netsecsp.github.io/doc/dns.md)
- [ftp](https://netsecsp.github.io/doc/ftp.md)
- [http](https://netsecsp.github.io/doc/http.md)
- [rtsp](https://netsecsp.github.io/doc/rtsp.md)
- [proxy](https://netsecsp.github.io/doc/proxy.md)
- [ssl](https://netsecsp.github.io/doc/ssl.md)
- [websocket](https://netsecsp.github.io/doc/websocket.md)
<u>extend modules</u>
- [console](/doc/console.md)
- [lua](/doc/lua.md)
- [zip](/doc/zip.md)
- [sqlite](/doc/sqlite.md)
- [console](https://netsecsp.github.io/doc/console.md)
- [lua](https://netsecsp.github.io/doc/lua.md)
- [zip](https://netsecsp.github.io/doc/zip.md)
- [sqlite](https://netsecsp.github.io/doc/sqlite.md)
# Thanks
> [Log4cplus](https://github.com/log4cplus/log4cplus)
......
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynFrame.idl";
cpp_quote("#pragma pack(push, 1)")
interface IAsynFileIoOperation;
interface IAsynRawDevice;
interface IAsynFile;
/////////////////////////////////////////////////////////////////////////////
[
object,
uuid(19210367-E7A5-453a-927B-B07CA450741E),
helpstring("IAsynFileIoOperation Interface"),
pointer_default(unique)
]
interface IAsynFileIoOperation : IAsynIoOperation
{
//获取/设置文件偏移
HRESULT GetPosition( [out]uint64_t* pPosition );
HRESULT SetPosition( [in ]uint64_t lPosition );
};
/***使用IAsynRawDevice打开以下设备的方法:
1、NamedPipe客户端
IAsynRawDevice.Open( "\\\\machinename\\pipe\\pipename", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION );
IAsynRawDevice.Open( "\\\\.\\pipe\\pipename", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, SECURITY_SQOS_PRESENT | SECURITY_IDENTIFICATION );
2、COM设备
IAsynRawDevice.Open( "\\\\.\\COM1", GENERIC_READ|GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0);
***/
[// PathName采用标准的设备访问方式,即以"\\\\"开头的字符串
object,
uuid(E84C89BE-2582-4afa-BBF6-3C47D655246E),
helpstring("IAsynRawDevice Interface"),
pointer_default(unique)
]
interface IAsynRawDevice : IAsynIoDevice
{
//返 回 值:S_OK -成功执行Open
// S_FALSE-已经Open,执行Open失败
// 其他值表示出错
HRESULT Open( [in ]IAsynFrameThread* pAsynFrameThread, [in ]STRING Path, [in ]uint32_t lDesiredAccess, [in ]uint32_t lShareMode, [in ]handle pSecurityAttributes, [in ]uint32_t lCreationDisposition, [in ]uint32_t lFlagsAndAttributes );
};
[// 只能用于文件,PathName形如:C:\\a.txt或者file://C:\\a.txt
object,
uuid(6B4BA849-DD57-4590-93BD-EF84AE97C193),
helpstring("IAsynFile Interface"),
pointer_default(unique)
]
interface IAsynFile : IAsynRawDevice
{
/////////////////////////////////////////////////////////////////////////
HRESULT GetFileSize( [out]uint64_t* pFileSize );
//为文件分配磁盘空间/设置文件大小,允许pAsynIoOperation=NULL
HRESULT SetFileSize( [in ]uint64_t lFileSize, [in ]IAsynIoOperation* pAsynIoOperation );
/////////////////////////////////////////////////////////////////////////
//刷新缓存到磁盘文件,允许pAsynIoOperation=NULL
HRESULT FlushBuffer( [in ]IAsynIoOperation* pAsynIoOperation );
};
[// 文件/目录监控
object,
uuid(4F01E7E2-D839-4af2-AC4D-DCEA84425B68),
helpstring("IAsynFileWatcher Interface"),
pointer_default(unique)
]
interface IAsynFileWatcher : IUnknown
{
HRESULT Commit( [in ]IUnknown* data, [in ]uint32_t Codepage );
};
/////////////////////////////////////////////////////////////////////////////
[// 隐式继承:IObjectHolder,用于设置/获取全局文件限速器
object,
uuid(8195BCC2-EFFB-4106-ACAE-20DFBFE84908),
helpstring("IAsynFileSystem Interface"),
pointer_default(unique)
]
interface IAsynFileSystem : IAsynIoOperationFactory
{
HRESULT CreateAsynRawDevice( [out]IAsynRawDevice** ppAsynRawDevice );
HRESULT CreateAsynFile( [out]IAsynFile** ppAsynFile );
HRESULT CreateAsynFileWatcher( [in ]IAsynFrameThread* pAsynFrameThread, [in ]STRING FilePath, [in ]BOOL bWatchSubtree, [in ]uint32_t lNotifyFilter, [out]IAsynFileWatcher** ppAsynFileWatcher );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
此差异已折叠。
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynFileSystem.idl";
cpp_quote("#pragma pack(push, 1)")
interface IAsynIpcDeviceListener;
interface IAsynIpcDevice;
interface IAsynNamedPipe;
/////////////////////////////////////////////////////////////////////////////
[
object,
uuid(63A88D82-1EB4-45a1-847D-0F2AE3D54D06),
helpstring("IAsynIpcIoOperation Interface"),
pointer_default(unique)
]
interface IAsynIpcIoOperation : IAsynIoOperation
{
HRESULT GetPeerAddress( [in ]IStringSetter* Name, [out]uint32_t* pid );
HRESULT SetPeerAddress( [in ]STRING Name, [in ]uint32_t pid );
};
[// 匿名管道是通过系统自动分配一个唯一的管道名字来创建的。
object,
uuid(852F8BD3-2CC0-40c4-8156-6AF0735FFCBD),
helpstring("IAsynNamedPipe Interface"),
pointer_default(unique)
]
interface IAsynNamedPipe : IAsynIoDevice
{
//返 回 值:S_OK -成功执行Open
// S_FALSE-已经Open,执行Open失败
// 其他值表示出错
HRESULT Open( [in ]IAsynFrameThread* pAsynFrameThread, [in ]STRING PipeName, [in ]uint32_t lOpenMode, [in ]BOOL bIsStream, [in ]uint32_t lMaxInstances, [in ]uint32_t lOutBufferSize, [in ]uint32_t lInBufferSize, [in ]uint32_t lDefaultTimeOut, [in ]handle pSecurityAttributes );
/////////////////////////////////////////////////////////////////////////
HRESULT Accept( [in ]IAsynIoOperation* pAsynIoOperation );
};
[// 模拟面向连接的Udp数据包传输方式, 读IAsynIoOperation无需分配IoBuffer,lParam1参数由对端Write的lParam1参数决定
object,
uuid(EB387F4A-854B-41f2-B92A-0C80E2E44515),
helpstring("IAsynIpcDevice Interface"),
pointer_default(unique)
]
interface IAsynIpcDevice : IAsynIoDevice
{
//注意参数:pAsynIoOperation必须是IAsynIpcIoOperation类型
HRESULT Connect( [in ]IAsynFrameThread* pAsynFrameThread, [in ]STRING IpcName, [in ]uint32_t lDstProcessId, [in ]IAsynIoOperation* pAsynIoOperation, [in ]uint32_t lTimeoutms );
};
[// 模拟面向连接的Udp数据包传输方式, 读IAsynIoOperation无需分配IoBuffer,lParam1参数由对端Write的lParam1参数决定
object,
uuid(9ED3FDED-C662-4d3c-A951-29E7FDEDADAF),
helpstring("IAsynIpcDeviceListener Interface"),
pointer_default(unique)
]
interface IAsynIpcDeviceListener : IAsynIoDevice
{
HRESULT Open( [in ]IAsynFrameThread* pAsynFrameThread, [in ]STRING IpcName );
/////////////////////////////////////////////////////////////////////////
//注意参数:pAsynIoOperation必须是IAsynIpcIoOperation类型
HRESULT Accept( [in ]IAsynIoOperation* pAsynIoOperation );
};
/////////////////////////////////////////////////////////////////////////////
[// 没有继承:IObjectHolder, 注意:依赖IAsynFileSystem
object,
uuid(D453C04E-A8E6-4d8d-B024-442365E86B85),
helpstring("IAsynIpcChannel Interface"),
pointer_default(unique)
]
interface IAsynIpcChannel : IAsynIoOperationFactory
{
HRESULT CreateAsynNamedPipe( [out]IAsynNamedPipe** ppAsynNamedPipe );
/////////////////////////////////////////////////////////////////////////
HRESULT CreateAsynIpcDevice( [out]IAsynIpcDevice** ppAsynIpcDevice );
//注意参数:keepalive=10用于建立连接后,用心跳检测对端进程是否已经假死,keepalive=0表示不用心跳检测,单位:100毫秒
HRESULT CreateAsynIpcDeviceListener( [in ]STRING argv/*默认等于null*/, [out]IAsynIpcDeviceListener** ppAsynIpcDeviceListener );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynNetwork.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
[// 提供协议代理服务接口: 自动识别代理协议版本, 返回IAsynIoBridge, 显式继承IAsynMessageEvents, 用于处理外部接入tcp连接
object,
uuid(68E29861-A676-4b82-803C-785CD0D75D6D),
helpstring("IAsynNetAgent Interface"),
pointer_default(unique)
]
interface IAsynNetAgent : IAsynMessageEvents
{
//注意: IAsynIoOperation可能携带数据或参数,接入Tcp连接协议代理: http/ftp/socks/telnet/pop3/smtp/rtmp/rtsp/mms, 返回IAsynIoBridge接口
// 数据转发: forward=schema://host:port, udp/tcp/ssl/ssh/udt
HRESULT Connect( [in ]IAsynRawSocket* pAsynSrcSocket, [in ]STRING Protocol, [in ]IAsynIoOperation* pAsynIoOperation, [in ]uint32_t lTimeoutms );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynFrame.idl";
cpp_quote("#pragma pack(push, 1)")
interface IAsynNetIoOperation;
interface IAsynDnsResolver;
interface IAsynRawSocket;
interface IAsynUdpSocket;
interface IAsynGrpSocket;
interface IAsynTcpSocket;
interface IAsynTcpSocketListener;
interface IAsynDtpSocketListener;
interface IAsynMuxSocket;
interface IAppService;
/////////////////////////////////////////////////////////////////////////////
typedef USHORT PORT; //端口:主机字节序
[// 支持AF_INET/AF_INET6/AF_IPX
object,
uuid(5544D1A8-7C18-4e08-98C2-48522983B3A0),
helpstring("IAsynNetIoOperation Interface"),
pointer_default(unique)
]
interface IAsynNetIoOperation : IAsynIoOperation
{
//获取/设置对端地址
HRESULT GetPeerAddress( [in ]IStringSetter* Host, [out]BYTE* Addr, [out]PORT* Port, [out]uint32_t* af );
HRESULT SetPeerAddress( [in ]BOOL Multi, [in ]STRING* Host, [in ]BYTE* Addr, [in ]PORT Port, [in ]uint32_t af );
/////////////////////////////////////////////////////////////////////////
//获取/设置域名, checkipx=1用于检查Host是否是Addr
HRESULT GetHost( [out]STRING* Host );
HRESULT SetHost( [in ]STRING Host, [in ]BOOL checkipx );
//获取/设置端口
HRESULT GetPort( [out]PORT* Port );
HRESULT SetPort( [in ]PORT Port );
};
[// 隐式继承:IObjectHolder/IDataTransmit,用于获取内部IDnsHostZone/IAsynDnsResolver,
object,
uuid(13C32332-EED4-4701-8644-C2F6E3CCBFE6),
helpstring("IAsynDnsResolver Interface"),
pointer_default(unique)
]
interface IAsynDnsResolver : IUnknown
{
//设置域名服务器地址,第一个地址为主Dns服务器
HRESULT SetDnsServer( [in ]STRING svc, [in, size_is(sizeof(STRING)*Count)]STRING* pHostport, [in ]uint32_t Count );
/////////////////////////////////////////////////////////////////////////
//提交解析请求,注意:调用之前必须通过IAsynIoOperation.SetHost设置域名,
HRESULT Commit( [in ]IUnknown* data, [in ]uint32_t af );
};
/////////////////////////////////////////////////////////////////////////////
[// 管理Tcp.半开连接数+Tcp.建立连接数
object,
uuid(11B383C7-EAFE-4766-85C0-69793799B4A3),
helpstring("IAsynTcplinkManager Interface"),
pointer_default(unique)
]
interface IAsynTcplinkManager : IUnknown
{
HRESULT Get( [out]uint32_t* pCurSynConnects );
HRESULT Set( [in ]uint32_t lMaxSynConnects );
};
/////////////////////////////////////////////////////////////////////////////
[// 提供Raw.SOCKET
// 注意:Clone的实现只能引用ISpeedController
object,
uuid(2D7B9AE9-C33A-4d98-B738-596F82044993),
helpstring("IAsynRawSocket Interface"),
pointer_default(unique)
]
interface IAsynRawSocket : IAsynIoDevice
{
//注意参数:af支持AF_INET/AF_INET6/AF_IPX
//返 回 值:S_OK -成功执行Open
// S_FALSE-已经Open,执行Open失败
// 其他值表示出错
HRESULT Open( [in ]IAsynFrameThread* pAsynFrameThread, [in ]uint32_t af, [in ]uint32_t type, [in ]uint32_t protocol );
/////////////////////////////////////////////////////////////////////////
//获取本端地址信息
//注意参数:当地址是全零时,不会设置pHost
HRESULT GetSockAddress( [in ]IStringSetter* Host, [out]BYTE* Addr, [out]PORT* Port, [out]uint32_t* af );
/////////////////////////////////////////////////////////////////////////
HRESULT GetSockopt( [in ]uint32_t type, [in ]uint32_t level, [in ]uint32_t optname, [in ]STRING optval );
HRESULT SetSockopt( [in ]uint32_t type, [in ]uint32_t level, [in ]uint32_t optname, [in ]STRING optval );
};
[// 提供Udp.SOCKET, 隐式继承:IAsynGrpSocket
object,
uuid(2C94171F-82C0-4ccb-A883-76E29C6AEAE2),
helpstring("IAsynUdpSocket Interface"),
pointer_default(unique)
]
interface IAsynUdpSocket : IAsynRawSocket
{
//绑定地址,Port=0表示随机,允许pAsynIoOperation等于NULL
HRESULT Bind( [in ]STRING Host, [in ]PORT Port, [in ]BOOL bReUseAddr, [in ]IAsynIoOperation* pAsynIoOperation );
};
[// 组播接口
object,
uuid(2B9ECE67-CEFA-4283-A07E-DCFF0E8A5986),
helpstring("IAsynGrpSocket Interface"),
pointer_default(unique)
]
interface IAsynGrpSocket : IUnknown
{
HRESULT Open( [in ]IAsynFrameThread* pAsynFrameThread, [in ]uint32_t af, [in ]uint32_t type, [in ]uint32_t protocol, [in ]uint32_t nttl, [in ]BOOL loop );
/////////////////////////////////////////////////////////////////////////
HRESULT Add( [in ]STRING IHost, [in ]STRING MHost );
HRESULT Pop( [in ]STRING IHost, [in ]STRING MHost );
};
[// 提供Tcp.SOCKET
object,
uuid(35671780-4E44-4563-A330-2876AEE3A5BB),
helpstring("IAsynTcpSocket Interface"),
pointer_default(unique)
]
interface IAsynTcpSocket : IAsynRawSocket
{
//Priority:连接优先级,值越小优先级越低,允许pAsynIoOperation等于NULL,Port=0由具体模块处理, 支持设置连接IP地址组实现proxy
HRESULT Connect( [in ]STRING Host, [in ]PORT Port, [in ]uint32_t Priority/*默认等于0*/, [in ]IAsynIoOperation* pAsynIoOperation, [in ]uint32_t lTimeoutms );
};
[// 提供Tcp.SOCKET
object,
uuid(91AAF082-BA4B-4c28-B042-D3CAB0244E8F),
helpstring("IAsynTcpSocketListener Interface"),
pointer_default(unique)
]
interface IAsynTcpSocketListener : IAsynRawSocket
{
//绑定地址,Port=0表示随机,允许pAsynIoOperation等于NULL
HRESULT Bind( [in ]STRING Host, [in ]PORT Port, [in ]BOOL bReUseAddr, [in ]IAsynIoOperation* pAsynIoOperation );
/////////////////////////////////////////////////////////////////////////
HRESULT Accept( [in ]IAsynIoOperation* pAsynIoOperation );
};
/////////////////////////////////////////////////////////////////////////////
[// 处理接入Tcp连接, 产生AF_QUERY_RESULT(IAsynDtpSocketListener/lTransferedBytes)
object,
uuid(A243506A-6E9C-453c-B556-F0C9619550DE),
helpstring("IAsynDtpSocketListener Interface"),
pointer_default(unique)
]
interface IAsynDtpSocketListener : IAsynMessageEvents
{
HRESULT CreateAsynTcpSocket( [in ]STRING argv, [out]IAsynTcpSocket** ppAsynTcpSocket );
HRESULT Accept( [in ]IAsynIoOperation* pAsynIoOperation );
};
[// 提供Tcp.SOCKET, 实现多路信道复用
object,
uuid(85AE4F4C-A618-49fc-9C01-E41E8FE8965E),
helpstring("IAsynMuxSocket Interface"),
pointer_default(unique)
]
interface IAsynMuxSocket : IAsynTcpSocket
{
HRESULT CreateAsynTcpSocket( [in ]STRING argv, [out]IAsynTcpSocket** ppAsynTcpSocket );
HRESULT Accept( [in ]IAsynIoOperation* pAsynIoOperation );
};
/////////////////////////////////////////////////////////////////////////////
[// 提供应用服务
object,
uuid(DFDD78F9-309A-4bb9-97D0-161969B9D192),
helpstring("IAppService Interface"),
pointer_default(unique)
]
interface IAppService : IUnknown
{
//action=0:停止服务;action=1:启动/继续服务;action=2:暂停服务
HRESULT Invoke( [in ]uint32_t action );
};
/////////////////////////////////////////////////////////////////////////////
[// 隐式继承:IObjectHolder,用于设置/获取全局网络限速器/dns解析器/连接管理器
object,
uuid(8AA7483F-9A26-4153-A403-C90A49200E73),
helpstring("IAsynNetwork Interface"),
pointer_default(unique)
]
interface IAsynNetwork : IAsynIoOperationFactory
{
//创建异步域名解析器
HRESULT CreateAsynDnsResolver( [in ]STRING Owner, [in ]IUnknown** param1, [in ]STRING param2, [in ]STRING* etchost, [out]IAsynDnsResolver** ppAsynDnsResolver );
/////////////////////////////////////////////////////////////////////////
HRESULT CreateAsynRawSocket( [in ]uint32_t lType/*默认等于0, 1: icmp */, [out]IAsynRawSocket** ppAsynRawSocket );
HRESULT CreateAsynUdpSocket( [out]IAsynUdpSocket** ppAsynUdpSocket );
HRESULT CreateAsynTcpSocket( [out]IAsynTcpSocket** ppAsynTcpSocket );
HRESULT CreateAsynTcpSocketListener( [in ]STRING argv/*默认等于null*/, [out]IAsynTcpSocketListener** ppAsynTcpSocketListener );
//创建IAsynPtlSocket:建立Socket链, param1传IAsynRawSocket数组, param2传参数
HRESULT CreateAsynPtlSocket( [in ]STRING Owner, [in ]IUnknown** param1, [in ]STRING param2, [out]IAsynRawSocket** ppAsynRawSocket );
/////////////////////////////////////////////////////////////////////////
//创建应用服务
HRESULT CreateAppService( [in ]STRING Owner, [in ]IUnknown** param1, [in ]STRING param2, [in ]IAsynMessageEvents* events, [out]IAppService** ppAppService );
/////////////////////////////////////////////////////////////////////////
HRESULT EnumLocalAdapter( [in ]uint32_t iaf, [in ]uint32_t flags, [in ]IAsynMessageEvents* events );
};
cpp_quote("#pragma pack(pop)")
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynFrame.idl";
cpp_quote("#pragma pack(push, 1)")
[// 控制台接口, 显式继承:IAsynMessageObject: 提供命令处理器注册, 必须继承IDataTransmit
object,
uuid(B6D9C9AB-6481-42f4-9AE5-4981A5F2905A),
helpstring("IConsole Interface"),
pointer_default(unique)
]
interface IConsole : IAsynMessageObject
{
//object重定向设备
HRESULT AllocWindow( [in ]IAsynFrameThread* thread, [in ]STRING title, [in ]uint32_t param2, [in ]IUnknown* object );
//////////////////////////////////////////////////////////////////////
//模拟输入:显示在控制台上
HRESULT Write( [in ]IUnknown* line, [in ]handle param1, [in ]uint64_t param2 );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynFrame.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
[
object,
uuid(1F4C098C-5615-4623-8EB0-64A012DC7DB4),
helpstring("IExceptionTrapper Interface"),
pointer_default(unique)
]
interface IExceptionTrapper : IUnknown
{
HRESULT SetupThreadExceptionTrapper();
/////////////////////////////////////////////////////////////////////////
HRESULT WriteDumpfile( [in ]STRING memname, [in ]uint32_t dumptype, [in ]STRING filepath );
HRESULT DumpStackinfo( [in ]STRING memname, [in ]IStringSetter* stack );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynNetwork.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
[// 显式继承IKeyvalSetter
object,
uuid(7A81B83C-2FF2-4bda-A5A6-336AC940F12E),
helpstring("INetmsg Interface"),
pointer_default(unique)
]
interface INetmsg : IKeyvalSetter
{
HRESULT Getline( [out]STRING* Method, [out]STRING* Param1, [out]STRING* Param2, [out]BOOL* ack );
HRESULT Setline( [in ]STRING Method, [in ]STRING Param1, [in ]STRING Param2 );
};
/////////////////////////////////////////////////////////////////////////////
[// 提供消息/数据分离的接口
object,
uuid(DCA84EA9-CC7F-4d6a-B7E5-7FD443F83BC1),
helpstring("INet Interface"),
pointer_default(unique)
]
interface INet : IAsynRawSocket
{
HRESULT SendPacket( [in ]STRING Method, [in ]STRING Param1, [in ]IUnknown *Param2, [in ]IAsynIoOperation* pAsynIoOperation );
};
/////////////////////////////////////////////////////////////////////////////
[// 提供Http数据传输隧道的接口
object,
uuid(DFFEA42D-B431-4C7B-876C-D545A4A58EC9),
helpstring("IHttpTxTunnel Interface"),
pointer_default(unique)
]
interface IHttpTxTunnel : IUnknown
{
HRESULT SetEnabled( [in ]uint32_t method ); //method=0表示只处理协议 method=1表示数据透传
};
cpp_quote("#pragma pack(pop)")
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynNetwork.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
[// 提供Proxy.SOCKET
object,
uuid(3FC5835E-8924-41ac-8631-131A4958B346),
helpstring("IAsynProxySocket Interface"),
pointer_default(unique)
]
interface IAsynProxySocket : IAsynRawSocket
{
HRESULT SetProxyContext( [in ]STRING Host, [in ]PORT port, [in ]STRING Method, [in ]IKeyvalSetter* Param2 );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "IAsynNetwork.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
[// 当bVerifyPeerCert!=0时,握手成功后产生AF_QUERY_RESULT(IAsynPtlSocket/PCCERT_CONTEXT)
object,
uuid(DF55F287-A527-430b-B13A-1CAA21CBB6C1),
helpstring("ISsl Interface"),
pointer_default(unique)
]
interface ISsl : IAsynRawSocket
{
//输入本端证书,必须在Open/Attach之前调用
HRESULT SetCryptContext( [in ]STRING* target, [in ]handle pctx, [in ]STRING* cert/*证书p12*/, [in ]STRING* password );
//校验对端证书
HRESULT VerifyPeerCertificate( [in ]handle pctx, [in ]uint32_t flags );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "oaidl.idl";
import "ocidl.idl";
cpp_quote("#pragma pack(push, 1)")
/////////////////////////////////////////////////////////////////////////////
typedef struct tagRANGE
{
uint64_t len;
uint64_t pos;
} RANGE;
[
object,
uuid(864BC6A2-5BDA-4eda-ADD4-B6EBC2BB171D),
helpstring("IRangesSetter Interface"),
pointer_default(unique)
]
interface IRangesSetter : IUnknown
{
HRESULT Set( [in ][size_is(sizeof(RANGE)*Size)]RANGE* Val, [in ]uint32_t Size );
};
typedef struct tagSTRING
{
uint32_t len;
[size_is(len)]BYTE* ptr;
} STRING;
[
object,
uuid(30044812-451F-4d2a-888C-A3D8222A6FBA),
helpstring("IStringSetter Interface"),
pointer_default(unique)
]
interface IStringSetter : IUnknown
{
HRESULT Get( [out]STRING* Val );
HRESULT Set( [in ]STRING Val );
};
[
object,
uuid(24CEF41C-4C1B-499b-B3A4-85119CB98B3A),
helpstring("IStringsStack Interface"),
pointer_default(unique)
]
interface IStringsStack : IStringSetter
{
HRESULT Pop( [in ]IStringSetter* Val );
HRESULT Add( [in ]STRING Val );
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
/*****************************************************************************
Copyright (c) netsecsp 2012-2032, All rights reserved.
Developer: Shengqian Yang, from China, E-mail: netsecsp@hotmail.com, last updated 05/01/2022
http://asynframe.sf.net
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are
met:
* Redistributions of source code must retain the above
copyright notice, this list of conditions and the
following disclaimer.
* Redistributions in binary form must reproduce the
above copyright notice, this list of conditions
and the following disclaimer in the documentation
and/or other materials provided with the distribution.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*****************************************************************************/
import "ITypedef.idl";
cpp_quote("#pragma pack(push, 1)")
[
object,
uuid(3427C7EA-00B9-4868-819A-02F01E756A69),
helpstring("IVmHost Interface"),
pointer_default(unique)
]
interface IVmHost : IUnknown
{
HRESULT AttachCurrentThread( [in ]uint32_t params, [out]handle* env );
HRESULT DetachCurrentThread();
};
cpp_quote("#pragma pack(pop)")
\ No newline at end of file
# console 插件
创建控制台,支持键盘/鼠标输入,加载/卸载实现IOsCommand接口的插件,便于产品在线调试
## 导出函数
```c++
HRESULT __stdcall CreateAsynFramePlugin( /*[out]*/IAsynFramePlugin** object )
```
## 开发
加载console插件
```c++
if( lpInstancesManager->Verify(STRING_from_string(IN_Console)) == S_OK )
{// 加载成功
CComPtr<IConsole> console;
lpInstancesManager->GetInstance(STRING_from_string(IN_Console), IID_IConsole, (void**)&console);
console->AllocWindow(spAsynFrameThread, asynsdk::STRING_EX::null, 3, 0); //创建控制台
}
else
{// 加载失败
}
```
## 例子
\support\testconsole
\ No newline at end of file
# dns 插件
实现基于udp/tcp/http的域名解析模块
## 导出函数
```c++
HRESULT __stdcall CreateAsynDnsResolver(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynMessageEvents* events,
/*[out]*/IAsynDnsResolver** object )
```
## 开发
uri格式:schema://[host1|..|hostn]:port/...
配置udp解析域名,udp://\*:53/
配置tcp解析域名,tcp://\*:53/
配置腾讯云解析域名,http://119.29.29.29/d?dn=[host].&ip=[ip]&ttl=1
配置阿里云解析域名,http://203.107.1.33/{account_id}/d?host=[host]&ip=[ip]&query=[af]
创建dns对象:
```c++
CComPtr<IAsynDnsResolver> spAsynDnsResolver;
const char *uri = "udp://8.8.8.8|8.8.4.4:53";
spAsynNetwork->CreateAsynDnsResolver(STRING_from_string("dns"), 0, STRING_from_string(uri), 0, &spAsynDnsResolver);
```
提交解析请求:
```c++
CComPtr<IAsynNetIoOperation> spAsynIoOperation;
m_spAsynNetwork->CreateAsynIoOperation(m_spAsynFrame, af, 0, IID_IAsynNetIoOperation, (void **)&spAsynIoOperation);
if( spAsynIoOperation->SetHost(STRING_from_string(host), 1) != S_OK )
{// 需要解析域名
return lpAsynDnsResolver->Commit(spAsynIoOperation, af) == S_OK;
}
else
{// 已是ipvx
printf("ip: %s\n", host.c_str());
return true;
}
```
异步解析结果:
```c++
HRESULT CAsynDnsHandler::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, 0, 0 );
switch(lAction)
{
case Io_hostdns:
{
if( lErrorCode != NO_ERROR )
{// 解析失败
printf("dns, error: %d\n", lErrorCode);
}
else
{// 解析成功
CComPtr<IStringsStack> spDnsResult;
HRESULT r = lpAsynIoOperation->GetCompletedObject(1, IID_IStringsStack, (void **)&spDnsResult);
asynsdk::CStringSetter addr;
for(int i = 0; spDnsResult->Pop(&addr) == S_OK ; ++ i)
{
printf("ip: %s\n", addr.m_val.c_str());
}
....
}
break;
}
}
}
```
## 例子
\support\testdns
\ No newline at end of file
# CreateAsynFramePlugin函数
通过实例管理器InstancesManager::Verify接口加载插件,同时设定该插件实例的插件名字
# 语法
```c++
HRESULT __stdcall CreateAsynFramePlugin( /*[out]*/IAsynFramePlugin** object )
```
# 参数
*[out]object*
返回对象指针
# 返回值
S_OK表创建插件成功,其他值表示失败
# 备注
InstancesManager::Verify接口实现流程
```mermaid
flowchart
A(开始)-->B{名字存在?}
B-- Y -->F(结束)
B-- N -->C{加载成功?}
C-- N -->F(结束)
C-- Y -->D(spPlugin->Initialize)
D-->E(加到列表)
E-->F(结束)
```
# CreateCommand函数
调用实例管理器InstancesManager::NewInstance接口创建IOsCommand对象
# 语法
```c++
HRESULT __stdcall CreateCommand(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/uint64_t param2,
/*[out]*/IOsCommand** object)
```
# 参数
*[in ]lpInstancesManager*
实例管理器,禁止lpInstancesManager=NULL
*[in ]ppParam1*
*[in ]param2*
*[out]object*
返回对象指针
# 返回值
S_OK表创建对象成功,其他值表示失败
# 备注
```c++
CComPtr<IOsCommand> object;
asynsdk::CStringSetter Soname(1, name);
IUnknown *params[2];
params[0] =&Soname;
params[1] = ppParam1[0];
params[2] = ppParam1[1];
lpInstancesManager->NewInstance(params, param2, IID_IOsCommand, (void **)&object.p);
```
# CreateDataTransmit函数
调用实例管理器InstancesManager::NewInstance接口创建IDataTransmit对象
# 语法
```c++
HRESULT __stdcall CreateDataTransmit(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/uint64_t param2,
/*[out]*/IDataTransmit** object)
```
# 参数
*[in ]lpInstancesManager*
实例管理器,禁止lpInstancesManager=NULL
*[in ]ppParam1*
*[in ]param2*
*[out]object*
返回对象指针
# 返回值
S_OK表创建对象成功,其他值表示失败
# 备注
```c++
CComPtr<IDataTransmit> object;
asynsdk::CStringSetter Soname(1, name);
IUnknown *params[2];
params[0] =&Soname;
params[1] = ppParam1[0];
params[2] = ppParam1[1];
lpInstancesManager->NewInstance(params, param2, IID_IDataTransmit, (void **)&object.p);
```
# CreateAsynPtlSocket函数
调用网络模块IAsynNetwork::CreateAsynPtlSocket接口创建Socket对象
# 语法
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
# 参数
*[in ]lpInstancesManager*
实例管理器,禁止lpInstancesManager=NULL
*[in ]ppParam1*
*[in ]param2*
*[out]object*
返回对象指针
# 返回值
S_OK表创建插件成功,其他值表示失败
# CreateAsynDnsResolver函数
调用网络模块IAsynNetwork::CreateAsynDnsResolver接口创建IAsynDnsResolver对象
# 语法
```c++
HRESULT __stdcall CreateAsynDnsResolver(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynMessageEvents* events,
/*[out]*/IAsynDnsResolver** object )
```
# 参数
*[in ]lpInstancesManager*
实例管理器,禁止lpInstancesManager=NULL
*[in ]ppParam1*
*[in ]param2*
*[in ]events*
*[out]object*
# 返回值
S_OK表创建对象成功,其他值表示失败
# CreateAppService函数
调用网络模块IAsynNetwork::CreateAppService接口创建IAppService对象
# 语法
```c++
HRESULT __stdcall CreateAppService(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynMessageEvents* events,
/*[out]*/IAppService** object )
```
# 参数
*[in ]lpInstancesManager*
实例管理器,禁止lpInstancesManager=NULL
*[in ]ppParam1*
*[in ]param2*
*[in ]events*
*[out]object*
# 返回值
S_OK表创建对象成功,其他值表示失败
\ No newline at end of file
# ftp 插件
实现ftp[s/t]的协议处理模块,支持INet/IAsynTcpSocket/IAsynRawSocket/IAsynTcpSocketListener等接口
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建显式ftp over tls/普通ftp对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ftp"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl_explicit? "tls/1.0" : "tcp/1.0"), &spAsynPtlSocket);
```
创建隐式ftp over tls对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
CComPtr<IAsynRawSocket> spAsynSslSocket;
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ssl"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string("tls/1.0"), &spAsynSslSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ftp"), (IUnknown**)&spAsynSslSocket.p, STRING_from_string("tcp/1.0"), &spAsynPtlSocket);
```
创建ftp[s/t]对象[server]:
```c++
CComPtr<IAsynTcpSocketListener> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocketListener(asynsdk::STRING_EX::null, &spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ftp"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "tls/1.0" : "tcp/1.0"), &spAsynPtlSocket);
```
发送ftp.req
```c++
CComPtr<IAsynIoOperation> spAsynIoOperation; m_spAsynFrame->CreateAsynIoOperation(0, 0, &spAsynIoOperation);
spNet->SendPacket(STRING_from_string("USER"), STRING_from_string("netsecsp"), 0, spAsynIoOperation);
```
接收ftp.req/ack
```c++
HRESULT CService::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
switch(lAction)
{
case Io_recv:
if( lErrorCode == NO_ERROR )
{// ftp.req/ack packet
CComPtr<INetmsg> spFtpmsg;
lpAsynIoOperation->GetCompletedObject(1, IID_INetmsg, (void **)&spFtpmsg);
STRING Method;
STRING Params;
BOOL ack;
spFtpmsg->Getline(&Method, &Params, 0, &ack );
std::string method = string_from_STRING(Method);
std::string params = string_from_STRING(Params);
printf("rcv ftp %s packet: %*s %*s\n", ack? "ack" : "req", Method.len, Method.ptr, Params.len, Params.ptr);
.....
}
break;
}
return E_NOTIMPL;
}
```
## 例子
[ftp client/server](https://github.com/netsecsp/aftpx)
\ No newline at end of file
# http 插件
实现http[s/t/u]的协议处理模块,支持INet/IAsynTcpSocket/IAsynRawSocket/IAsynTcpSocketListener等接口
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建http[s/t]对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "tls/1.0" : "tcp/1.0"), &spAsynPtlSocket);
```
创建http[s/t]对象[server]:
```c++
CComPtr<IAsynTcpSocketListener> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocketListener(asynsdk::STRING_EX::null, &spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("http"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "tls/1.0" : "tcp/1.0"), &spAsynPtlSocket);
```
发送http.req
```c++
asynsdk::CKeyvalSetter spKeyval(1);
spKeyval.Set(STRING_from_string("Session"), FALSE, STRING_from_string("2096569862826202657"));
spKeyval.Set(STRING_from_string("Content-Type"), FALSE, STRING_from_string("text/parameters"));
CComPtr<IAsynIoOperation> spAsynIoOperation; m_spAsynFrame->CreateAsynIoOperation(0, 0, &spAsynIoOperation);
spNet->SendPacket(STRING_from_string("GET"), STRING_from_string("/index.html"), &spKeyval, spAsynIoOperation);
```
接收http.req/ack
```c++
HRESULT CService::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
switch(lAction)
{
case Io_recv:
if( lErrorCode == NO_ERROR )
{// http.req/ack packet
CComPtr<INetmsg> spHttpmsg;
lpAsynIoOperation->GetCompletedObject(1, IID_INetmsg, (void **)&spHttpmsg);
STRING Method;
STRING Params;
STRING V;
BOOL ack;
spHttpmsg->Getline(&Method, &Params, &V, &ack );
std::string method = string_from_STRING(Method);
std::string params = string_from_STRING(Params);
std::string v = string_from_STRING(V);
printf("rcv http %s packet: %*s %*s\n", ack? "ack" : "req", Method.len, Method.ptr, Params.len, Params.ptr);
.....
}
break;
}
return E_NOTIMPL;
}
```
## 例子
[http client/server](https://github.com/netsecsp/ahttp)
\ No newline at end of file
# lua 插件
基于lua-5.4.4实现IOsCommand接口,用于打通asynframe framework,支持IOsCommand/IVmHost接口
## 导出函数
```c++
HRESULT __stdcall CreateCommand( /*[in ]*/InstancesManager *lpInstancesManager, /*[in ]*/IUnknown **ppParam1, /*[in ]*/uint64_t param2, /*[out]*/IOsCommand **ppObject)
```
## 开发
创建lua对象
```c++
spCommand.Attach(asynsdk::CreateCommand(lpInstancesManager, "lua", 0, 0, 0));
if( spCommand )
{
spCommand->Execute(0, STRING_from_string("open"), &STRING_from_string("test.lua"), 1, 0); //执行test.lua脚本
spCommand->Execute(0, STRING_from_string("exec"), &STRING_from_string("print("This is my world!")"), 1, 0); //执行lua脚本块
}
```
## 例子
\support\testlua\testapi
\ No newline at end of file
# Initialize函数
Initialize asynframe
# 语法
```c++
HRESULT __stdcall Initialize(/*[in ]*/IAsynMessageEvents *events, /*[in ]*/IKeyvalSetter *param2 )
```
# 参数
*[in ]events*
用于插件模块通知app事件,允许events=NULL
*[in ]param2*
配置参数信息,允许param2=NULL,默认自动加载应用数据目录下的config.ini文件
# 返回值
S_OK表Initialize asynframe成功,其他值表示失败。
# 备注
要求param2的配置信息的键格式:module_name, 值编码格式:utf8
若param2配置以下键值时:
1. key=";sysroot" 表示配置系统工作目录,默认asyncore.dll所在目录
2. key=";appdata" 表示配置应用数据目录,默认c:\Users\\\<account>\AppData\Roaming\netsecsp\\\<AppName>
3. key="asyncore_uniqueopspool" 表示是否创建有名工作线程池
4. key="asyncore_uniqueevtpool" 表示是否创建有名事件线程池
5. key="asyncore_uniquenetpool" 表示是否创建有名网络线程池
6. key="asynsock_net_iaf" 配置值2=ipv4/23=ipv6
7. key="asynsock_dns_url" 表示配置默认dnsurl
udp://\*:53 表示udp, tcp://\*:53 表示tcp, http://119.29.29.29/d?dn=[host].&ip=[ip]&ttl=1 表示使用腾讯云
> 获取配置对象
```c++
CComPtr<IKeyvalSetter> configure;
InstancesManager::GetInstance(STRING_from_string(IN_SysArgv), IID_IKeyvalSetter, &configure);
configure->Travel(0); //表示把配置信息刷新到应用数据目录的config.ini文件里
```
# GetInstancesManager函数
获取实例管理器
# 语法
```c++
InstancesManager* __stdcall GetInstancesManager()
```
# 返回值
返回实例管理器的<font color=red>引用指针</font>,app不能再调用Release释放
# Destory函数
destory asynframe
# 语法
```c++
HRESULT __stdcall Destory()
```
# 返回值
S_OK表示destory成功,其他值表示失败
\ No newline at end of file
# proxy 插件
实现ftp/http/socks的客户端代理协议处理模块,支持INet/IAsynTcpSocket/IAsynRawSocket/IAsynProxySocket等接口
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建显式ftp over tls/普通ftp代理对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("proxy"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl_explicit? "ftps/1.0" : "ftp/1.0"), &spAsynPtlSocket);
```
创建隐式ftp over tls代理对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
CComPtr<IAsynRawSocket> spAsynSslSocket;
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ssl"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string("tls/1.0"), &spAsynSslSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("proxy"), (IUnknown**)&spAsynSslSocket.p, STRING_from_string("ftp/1.0"), &spAsynPtlSocket);
```
创建http[s/t]代理对象[client]
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("proxy"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "https/1.0" : "http/1.0"), &spAsynPtlSocket);
```
创建socks代理对象[client]
```c++
#define SOCKS_VERNO "5.0" //4.0 4.a 5.0
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("proxy"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string("socks/" SOCKS_VERNO), &spAsynPtlSocket);
```
设置代理信息
```c++
CComPtr<IAsynProxySocket> spProxy; spAsynPtlSocket->QueryInterface(IID_IAsynProxySocket, (void **)&spProxy);
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")));
spProxy->SetProxyContext(STRING_from_string(m_setsfile.get_string("proxy", "host", "127.0.0.1")), m_setsfile.get_long("proxy", "port", 8080), STRING_EX::null, &params);
```
## 例子
[ftpx client](https://github.com/netsecsp/aftpx)
[http client](https://github.com/netsecsp/ahttp)
\ No newline at end of file
# rtsp 插件
实现rtsph/rtsp[t/u]的协议处理模块,支持INet/IAsynTcpSocket/IAsynRawSocket等接口
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建rtsp[t/u]对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("rtsp"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string("tcp/1.0"), &spAsynPtlSocket);
```
创建rtsp[t/u]对象[server]:
```c++
CComPtr<IAsynTcpSocketListener> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocketListener(asynsdk::STRING_EX::null, &spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("rtsp"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string("tcp/1.0"), &spAsynPtlSocket);
```
创建rtsph对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket[2];
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket[0]);
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket[1]);
IUnknown* ppParam2[2];
ppParam2[0] = spAsynInnSocket[0];
ppParam2[1] = spAsynInnSocket[1];
m_spAsynNetwork->CreateAsynPtlSocket( STRING_from_string("rtsp"), ppParam2, STRING_from_string("http/1.0"), &spAsynPtlSocket);
```
发送rtsp.req
```c++
asynsdk::CKeyvalSetter spKeyval(1);
spKeyval.Set(STRING_from_string("Session"), FALSE, STRING_from_string("2096569862826202657"));
spKeyval.Set(STRING_from_string("Content-Type"), FALSE, STRING_from_string("text/parameters"));
spKeyval.Set(STRING_from_string("CSeq"), FALSE, STRING_from_string("1"));
CComPtr<IAsynIoOperation> spAsynIoOperation; m_spAsynFrame->CreateAsynIoOperation(0, 0, &spAsynIoOperation);
char *body = "position: 346.000000\n"
"scale: 1.0";
unsigned int bodysize = strlen(body);
spAsynIoOperation->NewIoBuffer(0, (BYTE *)body, 0, bodysize, bodysize, 0);
spAsynIoOperation->SetIoParams(0, bodysize, bodysize);
spNet->SendPacket(STRING_from_string("GET_PARAMETER"), STRING_from_string("rtsp://127.0.0.1/1.mp4"), &spKeyval, spAsynIoOperation);
```
接收
```c++
HRESULT CService::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
switch(lAction)
{
case Io_recv:
if( lErrorCode == NO_ERROR )
{// rtsp.req/ack packet
CComPtr<INetmsg> spRtspmsg;
lpAsynIoOperation->GetCompletedObject(1, IID_INetmsg, (void **)&spRtspmsg);
STRING Method;
STRING Params;
STRING V;
BOOL ack;
spRtspmsg->Getline(&Method, &Params, &V, &ack );
std::string method = string_from_STRING(Method);
std::string params = string_from_STRING(Params);
std::string v = string_from_STRING(V);
printf("rcv rtsp %s packet: %*s %*s\n", ack? "ack" : "req", Method.len, Method.ptr, Params.len, Params.ptr);
.....
}
break;
}
return E_NOTIMPL;
}
```
## 例子
\support\testnetclient_rtsp
\support\testnetserver_rtsp
\ No newline at end of file
# sqlite 插件
基于sqlite-3.3.20实现IOsCommand接口,支持select/execute功能
## 导出函数
```c++
HRESULT __stdcall CreateCommand(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** ppParam1,
/*[in ]*/uint64_t param2,
/*[out]*/IOsCommand** object)
```
## 开发
插入数据
```c++
asynsdk::CStringSetter name(1, argc > 2 ? argv[2] : "test.db");
spCommand.Attach(asynsdk::CreateCommand(lpInstancesManager, "sqlite", 0, &name, 0));
spCommand->Execute(0, STRING_from_string("CREATE TABLE IF NOT EXISTS coreinfo(iseq INTEGER PRIMARY KEY AUTOINCREMENT, info TEXT, vals int);"), 0, 0, 0, 0);
spCommand->Execute(0, STRING_from_string("INSERT INTO coreinfo(info, vals) VALUES('show1', 1);"), 0, 0, 0, 0);
spCommand->Execute(0, STRING_from_string("INSERT INTO coreinfo(info, vals) VALUES('show2', 2);"), 0, 0, 0, 0);
```
查询数据
```c++
spCommand->Execute(0, STRING_from_string("SELECT * FROM coreinfo;"), 0, 0, 0, GetAsynMessageEvents());
```
```c++
void CSqlite::OnEventNotify(uint64_t lParam1, uint64_t lParam2, IUnknown *object)
{
STRING *vals = (STRING *)lParam2;
if( lParam1 == 0 )
{// 通知列名
printf("record");
for(int i = 0; vals[i].ptr; ++ i)
{
printf("\t%*s", vals[i].len, vals[i].ptr);
}
printf("\n");
}
else
{
if(!vals )
{// 通知没有后续数据
printf("%6I64d records\n", lParam1);
}
else
{// 通知一行数据
printf("%6I64d", lParam1);
for(int i = 0; vals[i].ptr; ++ i)
{
....
}
printf("\n");
}
}
}
```
## 例子
\support\testframe
\ No newline at end of file
# ssl 插件
实现ssl握手/加密/解密处理模块,支持ISsl/IAsynTcpSocket/IAsynRawSocket/IAsynTcpSocketListener等接口
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建ssl对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ssl"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(tls? "tls/1.0" : "ssl/3.0"), &spAsynPtlSocket);
```
创建ssl对象[server]:
```c++
CComPtr<IAsynTcpSocketListener> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocketListener(asynsdk::STRING_EX::null, &spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("ssl"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(tls? "tls/1.0" : "ssl/3.0"), &spAsynPtlSocket);
```
设置p12证书
```c++
CComPtr<ISsl> spSsl;
spAsynPtlSocket->QueryInterface(IID_ISsl, (void**)&spSsl);
spSsl->SetCryptContext(0, 0, &p12_cert, &password);
```
## 例子
\support\testnetclient_ssl
\support\testnetserver_ssl
\ No newline at end of file
# websocket 插件
实现websocket的协议处理模块,支持INet/IAsynTcpSocket/IAsynRawSocket/IAsynTcpSocketListener等接口
自动把http/1.1协议升级到websocket协议
## 导出函数
```c++
HRESULT __stdcall CreateAsynPtlSocket(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown** param1,
/*[in ]*/const char* param2,
/*[in ]*/IAsynRawSocket** object )
```
## 开发
创建ws/wss对象[client]:
```c++
CComPtr<IAsynTcpSocket> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocket(&spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("websocket"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "tls/13" : "tcp/13"), &spAsynPtlSocket);
```
创建ws/wss对象[server]:
```c++
CComPtr<IAsynTcpSocketListener> spAsynInnSocket;
m_spAsynNetwork->CreateAsynTcpSocketListener(asynsdk::STRING_EX::null, &spAsynInnSocket);
m_spAsynNetwork->CreateAsynPtlSocket(STRING_from_string("websocket"), (IUnknown**)&spAsynInnSocket.p, STRING_from_string(ssl? "tls/13" : "tcp/13"), &spAsynPtlSocket);
```
发送http.req
```c++
CComPtr<IAsynIoOperation> spAsynIoOperation; m_spAsynFrame->CreateAsynIoOperation(0, 0, &spAsynIoOperation);
spNet->SendPacket(STRING_from_string("GET"), STRING_from_string("/chat"), 0, spAsynIoOperation);
```
opcode定义:
0x0:表示一个延续帧。当opcode=0时,表示本次数据传输采用了数据分片,当前收到的数据帧为其中一个数据分片。第一帧: FIN=0/code>0 中间帧: FIN=0/code=0 最后帧: FIN=1/code=0
0x1:表示这是一个字符串帧(frame)
0x2:表示这是一个二进制帧(frame)
0x3-7:保留的操作代码,用于后续定义的数据帧。
0x8:表示连接断开。
0x9:表示这是一个ping操作。
0xA:表示这是一个pong操作。
0xB-F:保留的操作代码,用于后续定义的控制帧
发送websocket控制帧[opcode=0x08\~0x0F]
```c++
spNet->Write(lpAsynIoOperation, 0x08); //发送断开命令
```
发送websocket数据帧[opcode=0x00\~0x07/0x80\~0x87]
```c++
spNet->Write(lpAsynIoOperation, 0x82); //发送数据
```
接收
```c++
HRESULT CService::OnIomsgNotify( uint64_t lParam1, uint64_t lAction, IAsynIoOperation *lpAsynIoOperation )
{
uint32_t lErrorCode = NO_ERROR, lTransferedBytes;
lpAsynIoOperation->GetCompletedResult(&lErrorCode, &lTransferedBytes, 0);
switch(lAction)
{
case Io_recv:
if( lErrorCode == NO_ERROR )
{// http.req/ack packet
if( m_upgrade )
{
if( lParam1 >= 0x08 && 0x0F >= lParam1 )
{// 控制帧
....
}
else
{// 数据帧
....
}
}
CComPtr<INetmsg> spHttpmsg;
lpAsynIoOperation->GetCompletedObject(1, IID_INetmsg, (void **)&spHttpmsg);
STRING Method;
STRING Params;
STRING V;
BOOL ack;
spHttpmsg->Getline(&Method, &Params, &V, &ack );
std::string method = string_from_STRING(Method);
std::string params = string_from_STRING(Params);
std::string v = string_from_STRING(V);
printf("rcv http %s packet: %*s %*s\n", ack? "ack" : "req", Method.len, Method.ptr, Params.len, Params.ptr);
if( ack )
{// client
if( atoi(params.c_str())/100 == 1 )
{
m_upgrade = 1; //mark: 升级websocket协议成功
发送websocket帧协议
....
}
}
else
{// server
spNet->SendPacket(STRING_from_string("101"), STRING_from_string("Switching Protocols"), 0, lpAsynIoOperation);
m_upgrade = 1; //mark: 接受http升级到websokcet协议
}
.....
}
break;
}
return E_NOTIMPL;
}
```
## 例子
\support\testnetclient_websocket
\support\testnetserver_websocket
\ No newline at end of file
# zip 插件
基于zlib-1.2.11.0实现IDataTransmit接口,具备zip多个文件以及deflate/inflate数据功能
## 导出函数
```c++
HRESULT __stdcall CreateDataTransmit(/*[in ]*/InstancesManager* lpInstancesManager,
/*[in ]*/IUnknown* param1,
/*[in ]*/uint64_t param2,
/*[out]*/IDataTransmit** object)
```
## 开发
zip多个文件
```c++
asynsdk::CStringSetter name(1, "dst.zip");
spDataTransmit.Attach(asynsdk::CreateDataTransmit(lpInstancesManager, "zip", &name, 0));
if( spDataTransmit )
{
BYTE tmp[1024];
FILE *f1 = fopen(".\\1.txt", "rb");
if( f1 )
{
asynsdk::CStringSetter v(1, ".\\scripts\\1.txt");
spDataTransmit->Write(&v, "1.txt:comments=1:password=123456", 0);
while( 1 ) {
int l = fread(tmp, 1, 1024, f1);
if( l <= 0 ) break;
spDataTransmit->Write(0, tmp, l);
}
fclose(f1);
}
FILE *f2 = fopen(".\\2.txt", "rb");
if( f2 )
{
asynsdk::CStringSetter v(1, ".\\scripts\\2.txt");
spDataTransmit->Write(&v, "2\\2.txt", 0);
while( 1 ) {
int l = fread(tmp, 1, 1024, f2);
if( l <= 0 ) break;
spDataTransmit->Write(0, tmp, l);
}
fclose(f2);
}
}
```
## 例子
\support\testframe
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册