本帖最后由 斜飞 于 2021-8-8 09:04 编辑
易语言的科学计数法会丢失数据,必须以指针方式,或者文本方式存放来读取和写入,此方法使我非常苦恼,又因易语言的unicode不能显示原因导致我的一些数据必须以转码方式存放与读取,所以打算学习下火山开发,但是突然发现自己好像玩不转(关于底层封装,数据转换),于是打算学习下C++再来学习火山,在学习了一个星期C++,发现C++不是那么难,易语言进阶学者都可以学下,拿国外开源项目websocketpp实践下(因为这玩意比较简单),编译给易语言使用。,本贴结尾分享websocketppC++源码,易语言内存调用源码。
WebSocket++ 是一个 C++ 库,可用于实现 WebSocket 功能。该项目的目标是提供可移植、灵活、轻量级、低级别和高性能的 WebSocket 实现。
WebSocket++ 不打算单独用作 Web 应用程序框架或全功能 Web 服务平台。因此,组件、示例和性能调整面向作为 WebSocket 客户端或服务器的操作。有一些最小的便利特性偏离了这一点(例如响应除 WebSocket 升级以外的 HTTP 请求的能力),但这些不是项目的重点。特别是 WebSocket++ 不打算实现任何非 WebSocket 相关的回退选项(ajax/长轮询/彗星等)。
为了保持紧凑和提高可移植性,WebSocket++ 项目努力在可能和适当的情况下减少或消除外部依赖。除了 C++11 标准库之外,WebSocket++ 核心没有任何依赖项。对于非 C++11 编译器,Boost 库为所使用的 C++11 功能提供了 polyfill。
WebSocket++ 实现了一个可插拔的数据传输组件。默认组件允许通过使用 STL iostream 或通过读取和写入字符缓冲区的原始字节改组来减少功能。该组件没有非 STL 依赖,可以在没有 Boost 的 C++11 环境中使用。还包括一个基于 Asio 的传输组件,它提供全功能的网络客户端/服务器功能。该组件需要 Boost Asio 或 C++11 编译器和独立的 Asio。作为高级选项,如果您想使用其他库提供自己的传输层,WebSocket++ 支持自定义传输层。
为了适应 WebSocket++ 收集的各种用例,该库的构建方式是大多数主要组件都是松散耦合的,并且可以换出和替换。WebSocket++ 将尝试跟踪 WebSocket 协议和任何扩展的未来发展。
Websocketpp介绍。
Websocketpp又称的WebSocket ++,WebSocket++ 是一个 C++ 库,可用于实现 WebSocket 功能。该项目的目标是提供可移植、灵活、轻量级、低级别和高性能的 WebSocket 实现。。
这是官网:https://docs.websocketpp.org/index.html
具有以下等功能。
1.子协议交互
2.设置和读取协议头
3.心跳ping和pong
4.Http代理
5.设置UA协议头
6.设置Origin
7.定时器和线程安全
8.主动关闭
9.所有向连接发送一条消息
上面写的功能我都没有封装,只封装了回调绑定,连接,发送等功能...
- 关于websocketpp编译
- C++编译DLL供易语言使用
- 易语言DLL文件不落地内存调用
websocketpp SSL编译环境需要Boost库和OPENSSL库,这两个库可以网上下载或者自己到官网源码区编译(我是下载编译好)
Boost库官网:http://www.boost.org/ Boost库版本下载地址: https://sourceforge.net/projects/boost/files/boost-binaries/ openssl下载地址: https://www.openssl.org/source/ 以及websocketpp源码下载地址:https://github.com/zaphoyd/websocketpp 我们打开测试例子print_client_tls文件cpp 包含头文件和库以后遇到坑,提示删除lib文件,这里我们给加上; #pragma comment ( lib , "libcrypto.lib" ) #pragma comment ( lib , "libssl.lib" )
添加以后编译通过~
C++编译DLL供易语言使用
#define dllinput __declspec ( dllexport )//改名
dllinput int __stdcall SetInit ( int * openPtr , int * message , int * onCloss ) //声明函数
打开配置属性 -- C/C++ -- 高级 -- 调用约定
我们可以看到C ++默认编译是__cdecl调用约定,直接编译会导致导出的函数名字乱码(函数名字粉碎机由来)。
一般人会用extern “C”会添加到导出函数前面,防止C ++乱来(这句话代码是C ++编译器按C标准来编译C语言代码)
但是这样我们不得不在易语言声明DLL名中加上@
所以我们用另一种导出函数名字方式,创建def定义文件,添加函数名称,这样c++就会跟着你定义的函数名字编译。我们还需要在导出函数的类型后面加一个__stdcall,来使易语言能够直接调用。
编译后的DLL文件200KB,真是小而又强悍!
易语言DLL文件不落地内存调用
为什么要写内存调用,因为我们是用易语言,易语言静态编译都是只有一个文件,如果目录里加个DLL文件,PHP天下第一的语言爱好者还以为我们会其他语言。
我们去怪兽乐园②群。打开易语言专区,偷偷下载HP_Socket 5.7.1 Beta3_内存Dll完整版_[教程调用有问题请大牛修复].e
|
_GetProcAddress | 整数型 | | |
hLibModule | 整数型 | | | | lpProcName | 整数型 | | | | 置入代码 ({ 93, 131, 236, 12, 86, 139, 116, 36, 20, 133, 246, 116, 19, 139, 76, 36, 24, 133, 201, 116, 11, 139, 70, 60, 3, 198, 131, 120, 124, 0, 117, 9, 51, 192, 94, 131, 196, 12, 194, 8, 0, 139, 64, 120, 43, 76, 48, 16, 139, 84, 48, 20, 83, 139, 92, 48, 32, 3, 198, 85, 139, 104, 36, 87, 139, 120, 28, 3, 254, 3, 222, 3, 238, 137, 124, 36, 20, 137, 84, 36, 32, 59, 202, 119, 15, 139, 4, 143, 95, 93, 91, 3, 198, 94, 131, 196, 12, 194, 8, 0, 139, 64, 24, 51, 255, 137, 68, 36, 16, 133, 192, 118, 76, 15, 183, 76, 125, 0, 137, 76, 36, 24, 59, 202, 119, 58, 139, 4, 187, 139, 76, 36, 36, 3, 198, 138, 17, 58, 16, 117, 26, 132, 210, 116, 18, 138, 81, 1, 58, 80, 1, 117, 14, 131, 193, 2, 131, 192, 2, 132, 210, 117, 228, 51, 192, 235, 5, 27, 192, 131, 216, 255, 133, 192, 116, 25, 139, 84, 36, 32, 139, 68, 36, 16, 71, 59, 248, 114, 180, 95, 93, 91, 51, 192, 94, 131, 196, 12, 194, 8, 0, 139, 68, 36, 20, 139, 76, 36, 24, 139, 4, 136, 95, 93, 91, 3, 198, 94, 131, 196, 12, 194, 8, 0 })返回 (0 )
看几遍内存调用机制,好把,这个汇编写的,我实在看不懂。
但不妨碍我复制粘贴代码的操作。
但是你以为我就不懂原理?赶紧百度搜一下装大神。。。。
LoadLibrary加载dll,返回模块句柄,_GetProcAddress 获取函数地址,用官网核心库调用子程序()就可以达到内存调用了
这时候原理都明白了,接着写内存调用写成模块。模块通过编译大小200KB,测试功能,完整。
但是。。
我尼玛这个websocketpp是一个单线程,我得手动开启多线程,好在websocketpp官网自带线程教程,而且它的线程是安全的。
教你写多线程以及ID映射: https://docs.websocketpp.org/md_tutorials_utility_client_utility_client.html
特别是,WebSocket 客户端需要安全的随机数生成器。WebSocket++ 可以使用boost_random使用C++11 标准库<random>。因为这个例子也使用了线程,如果我们没有 C++11 std::thread 可用,我们将需要包含boost_thread。
该websocket_endpoint对象获得了一些新的数据成员和方法。它现在可以追踪连接ID和关联数据之间的映射,以及要分发的下一个连续ID号。该connect()方法启动一个新的连接方法。该get_metadata方法检索给定 ID 的元数据。
这些多线程和ID操作就不搞了,以后有时间慢慢来,这就是我学完C++的所做出的果实。
下面是C++源代码。易语言模块源代码。易语言测试示例源代码
有一起学习交流的小伙伴可以加下群:383339351
贴是教程贴。。。。
回复此见
wss服务端[拿来测试用的].zip
(858.8 KB, 下载次数: 241)
|