|
HP-Socket 易语言封装 6.0.8 整理版 基于论坛大佬开源的修改更新版本 模块内保留了原作者的信息 这是一个面向易语言使用者整理的 HP-Socket 封装项目,基于原来的 HPSocket 5.9.1 示例工程升级维护,主要目标是:让易语言可以更稳、更方便地调用新版 HP-Socket,并提供一个能直接参考的 HTTP/HTTPS Server 示例。 本次整理重点更新了 HPSocket4C.dll、HP_Socket 易语言模块封装,以及 Http_Server.e 示例代码。原工程能跑,但里面有一些老版本遗留问题和示例级代码隐患,这次顺手把这些坑填了一遍。 项目内容适合谁用这个项目适合下面这些场景: 易语言开发 TCP / UDP / HTTP / HTTPS 程序 想在易语言里使用 HP-Socket 高性能网络库 需要一个 HTTP 接口服务、本地服务、回调服务示例 想学习 HP-Socket C 接口在易语言里的封装方式 原来使用 5.9.1,想升级到 6.0.8 又不想自己一个个对接口
本次主要升级1. DLL 更新到 6.0.8底层 HPSocket4C.dll 已更新为官方 HP-Socket 6.0.8 x86 版本。 2. 模块接口同步新版导出HP_Socket 模块补充了 6.0.8 中新增或需要同步的接口,例如: HP_Server_SetDualStack HP_Server_IsDualStack HP_UdpNode_SetDualStack HP_UdpNode_IsDualStack HP_TcpAgent_SetSyncConnectTimeout HP_TcpAgent_GetSyncConnectTimeout HP_TcpClient_SetSyncConnectTimeout HP_TcpClient_GetSyncConnectTimeout
同时移除了新版 DLL 中已经不存在的 SYS_Alloca 声明,避免接口和 DLL 不匹配。 HP_Socket 模块修复UDP Node 地址获取问题修复 IUdpNode.GetLocalAddress 调错函数的问题。原来的封装可能会调用到不对应的地址获取函数,导致获取结果不可靠。 UDP 端口类型修正修正 UDP Node 相关端口参数类型,统一使用 短整数型,和 HP-Socket C API 的端口类型保持一致。 地址缓冲区更稳优化 IServer、IAgent、IClient、IUdpCast、IUdpNode 的地址获取逻辑,减少地址被截断、缓冲区长度不够或读取失败的问题。 修复 IConvert 重复加载内存泄漏IConvert.Load 重复调用时,旧 buffer 没有正确释放。现在会先释放旧数据,再加载新数据,避免内存越跑越高。 修复 IWinHttpEx 连接复用问题优化 IWinHttpEx 的连接复用判断,避免错误复用无效连接。 修复 IWinHttpEx 超时状态清理请求超时后会主动断开并清空 m_ConnId,避免后续请求继续拿旧连接 ID 发送。 Http_Server.e 示例修复1. 修复 HTTPS 对象未销毁原示例只销毁了 g_HttpServer,没有销毁 g_HttpsServer。现在退出时会同时销毁 HTTP 和 HTTPS 对象。 2. 退出前先停止正在运行的服务窗口销毁时,如果当前 server 还在运行,会先 Stop,再销毁对象,资源释放更规矩。 3. 删除 OnReceive 原始数据回发原代码在 HTTP Server 的 OnReceive 事件里直接把收到的原始请求数据 Send 回客户Duan。 这对 HTTP 服务端来说不合适,容易破坏正常 HTTP 响应流程。现在 OnReceive 只返回 #HR_OK,真正的响应统一在请求完成后用 SendResponse 发送。 4. POST Body 增加大小限制原示例会无限累加 POST 数据,遇到大请求或恶意请求时容易撑爆内存。 现在增加: .常量 MAX_BODY_SIZE, "1048576"默认限制为 1MB,超过直接返回错误。 5. 连接缓存创建失败会处理OnAccept 中创建 IBufferPtr 或绑定 ConnectionExtra 失败时,现在会释放资源并返回错误,不再静默继续。 6. 线程池启动和提交任务增加检查线程池创建/启动失败会记录日志。请求完成后提交任务失败,也会返回错误,避免请求挂住没有响应。 7. HTTPS SSL 初始化增加检查启动 HTTPS 前会检查证书文件是否存在,并判断 SetupSSLContext 是否成功。 如果 SSL 没初始化成功,HTTPS 启动会被禁止,避免后面报一堆看不懂的问题。 8. 响应头修正原来响应头写的是: Accept: text/plain, text/htmlAccept 是请求头,不适合作为响应头。 现在改为: Content-Type: text/plain; charset=gbk9. 端口增加校验启动前检查端口范围,必须是 1-65535。空端口、负数、超范围都会直接提示。 10. 启动失败后清空 m_server如果 Start 失败,会把 m_server 清空,避免后续停止或销毁逻辑误判。 11. GetSenderName 更准确原来只要不是 HTTP,就默认显示 HTTPS。现在未知句柄会显示 unknown,日志更真实。 12. 连接附加对象释放后清空OnClose 释放 IBufferPtr 后,会调用 SetConnectionExtra(..., 0) 清空附加数据,避免异常路径重复引用。 使用建议推荐配套使用建议 HP_Socket 模块、HPSocket4C.dll、Http_Server.e 示例保持同一套版本,不要混用旧模块和新 DLL。 如果模块是 6.0.8,DLL 也建议使用 6.0.8 x86。 HTTPS 需要证书HTTPS 示例默认使用: ssl-cert\server.cer
ssl-cert\server.prikey
ssl-cert\ca.cer如果证书不存在,HTTP 可以正常使用,HTTPS 会提示 SSL 未初始化。 POST 限制可自行调整默认 POST Body 限制为 1MB: .常量 MAX_BODY_SIZE, "1048576"如果你的接口需要上传更大的数据,可以按实际情况调整。 注意事项本整理版主要面向 32 位易语言环境。 HPSocket4C.dll 请放在程序运行目录,或使用示例内置释放逻辑。 如果易语言 IDE 已打开旧文件,更新后需要关闭并重新打开工程。 如果自己继续改 .e,建议保留备份,尤其是涉及模块、程序集变量和资源时。
版权说明HP-Socket 是 JessMA 开源项目,遵循 Apache License 2.0。 原项目信息: Copyright JessMA Open Source (ldcsaa@gmail.com)
Author : Bruce Liang
Website : http://www.jessma.org
Project : https://github.com/ldcsaa
Blog : http://www.cnblogs.com/ldcsaa
Wiki : http://www.oschina.net/p/hp-socket
License : Apache License 2.0
|