易语言linux 版socket,Hp-socket_TcpPack同步-易语言类模块

.版本 2

.支持库 sock

.程序集 Hp_PackTCP, , 公开

.程序集变量 m_client, 网络客户端, , , 这个网络客户端不知道有没有什么问题,看着用, 不行换 socket() 来创建客户端

.程序集变量 m_buffer, 字节集, , , 如果追求高大上, 就换内存池

.程序集变量 m_requiredLen, 整数型, , , 拆包用的

.程序集变量 m_buffLen, 整数型, , , 拆包用的

.程序集变量 m_isHeader, 逻辑型, , , 拆包用的

.程序集变量 m_flag, 整数型, , , 包标记

.程序集变量 m_maxLen, 整数型, , , 单次send最大长度

.子程序 _初始化, , , 当基于本类的对象被创建后,此方法会被自动调用

Reset ()

.子程序 Reset

m_client.断开 ()

m_buffer = { }

m_requiredLen = 4

m_isHeader = 真

m_buffLen = 0

m_flag = 0

m_maxLen = 4095 × 1024

.子程序 _销毁, , , 当基于本类的对象被销毁前,此方法会被自动调用

Reset ()

.子程序 DisConnect, , 公开

Reset ()

.子程序 Recv, 字节集, 公开, 返回{ }的话, 可能是超时, 也可能是异常断开了

.参数 timeout, 整数型, , 0 无限等待.

.局部变量 bResult, 逻辑型

.局部变量 dataAll, 字节集

.局部变量 dataTemp, 字节集

.局部变量 ret, 字节集

ret = { }

.判断循环首 (真)

' 够了 , 第一次肯定是不成立的, 会直接走到下面的 接受

.判断循环首 (m_buffLen ≥ m_requiredLen)

m_buffLen = m_buffLen - m_requiredLen

.判断开始 (m_isHeader)

' 是包头

' 减去包头长度.

' 从包头获取包体长度

m_requiredLen = GetPacketLen (m_buffer)

' buff里最前面的包头清掉,只保留后面的, 下一次再来数据, 就是包体了 , 包头长度4

m_buffer = 取字节集右边 (m_buffer, 取字节集长度 (m_buffer) - 4)

' 下一次期待包体

m_isHeader = 假

.判断开始 (m_requiredLen > m_maxLen)

' 数据长度太大, GG

ret = { }

m_client.断开 ()

跳出循环 ()

.默认

.判断结束

.默认

' 包体数据够了

ret = 取字节集左边 (m_buffer, m_requiredLen)

' buffer处理一下, 把已经ok的数据清掉, 只保留后面的尚未处理的数据

m_buffer = 取字节集右边 (m_buffer, 取字节集长度 (m_buffer) - m_requiredLen)

' 下一次期待包头

m_isHeader = 真

' 期待包头, 4字节

m_requiredLen = 4

' 收到了完整的数据了

返回 (ret)

.判断结束

.判断循环尾 ()

' 易语言这个 接受 , 如果指定了超时, bResult会是假, 但并不知道到底是断开还是超时.................

dataTemp = m_client.接收 (timeout, bResult)

.判断开始 (bResult)

' 收到了, 先跟之前的buffer中数据合并

m_buffer = m_buffer + dataTemp

' 当前buffer中的数据长度

m_buffLen = 取字节集长度 (m_buffer)

.默认

' 断开? 也可能是超时? .

ret = { }

跳出循环 ()

.判断结束

.判断循环尾 ()

返回 (ret) ' 返回空字节集表示连接断开

.子程序 SetMaxPacketSize, , 公开, 设置最大单次send长度, 需要与服务端一致

.参数 len, 整数型

m_maxLen = len

.子程序 SetPacketFlag, , 公开

.参数 flag, 整数型

m_flag = flag

.子程序 Send, 逻辑型, 公开

.参数 data, 字节集

.参数 timeout, 整数型, , 0 无限等待,-1 不等待 其它 具体等待时间(毫秒)。

.局部变量 头, 字节集

.局部变量 len

len = 取字节集长度 (data)

.判断开始 (len = 0 或 len > m_maxLen)

返回 (假)

.默认

.判断结束

头 = AddPacketHeader (m_flag, 取字节集长度 (data))

返回 (m_client.发送 (头 + data, timeout))

.子程序 Connect, 逻辑型, 公开

.参数 ip, 文本型

.参数 port, 整数型

返回 (m_client.连接 (ip, port))

.子程序 GetPacketFlag, 整数型, , 拆包用的, 不需要自行调用 从服务端发过来的包头中,得到包标记

.参数 数据, 字节集

.局部变量 头, 整数型

.判断开始 (取字节集长度 (数据) < 4)

' 非法数据

返回 (-1)

.默认

.判断结束

头 = 取字节集数据 (数据, 3, )

返回 (右移 (头, 22))

.子程序 GetPacketLen, 整数型, , 拆包用的, 不需要自行调用 从服务端发过来的包头中,得到包长

.参数 数据, 字节集

.局部变量 头

.判断开始 (取字节集长度 (数据) < 4)

' 非法数据

返回 (-1)

.默认

.判断结束

头 = 取字节集数据 (数据, 3, )

返回 (位与 (头, 十六进制 (“03FFFFF”)))

.子程序 AddPacketHeader, 字节集, , 封包用的, 不需要自行调用 生成包头

.参数 flag

.参数 len

.局部变量 header, 整数型

header = 位或 (左移 (flag, 22), len)

返回 (到字节集 (header))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
git传送:https://github.com/ldcsaa/HP-Socket 他的demo里面有几个参数没有返回数据,报错了,给加上去了。 部分更新日志: 不再更新中文模块,有四方面原因 1、主要更新英文模块是因为出问题了好查资料,而且各个组件的方法和参数都有详细的中文注释 2、精力有限,近来工作越发的紧凑,没有时间更新。 3、英文模块框架更新,增强稳定性,如果要适配到中文模块,相当于重写了。 4、小卓的中文支持库已经很稳定了,可以完全代替中文模块(中文模块因为框架更新已经出现了很多BUG)。 [15:45 2019/12/03] ========================================================================================== v5.7.1 更新: ========================================================================================== > UDP 组件更新: ----------------- 1、增加新组件:UDP Node 1) UDP Node 没有“连接”的概念,可以与任意地址相互收发数据 2) UDP Node 支持三种运行模式:单播、组播和广播 3) 增加 UDP Node 组件示例 Demo - TestUDPNode > 其它更新: ----------------- 1、所有通信组件都增加方法 SetReuseAddressPolicy() 支持设置地址重用策略 2、大量 API 更新,代码重构、优化 > 升级说明: ----------------- 1、HP-Socket v5.7.1 改动或删除了小部分 API,升级时请参考 Chang-APIs.txt 2、UdpNode 的例程本来写好的,结果上次忘记保存了,等正式发上来,最近生病,家人也不好。 [00:00 2019/11/16] > UDP 组件更新: ----------------- 1、增加 UDP Node 组件 1) UDP Node 没有“连接”的概念,可以与任意地址相互收发数据 2) UDP Node 支持三种运行模式:单播、组播和广播 > TCP 组件更新: ----------------- 1、TCP PACK 系列组件(Client/Agent/Server)改用固定字节序传输内部包头,兼容大端与小端字节序平台 > 升级说明: ----------------- 1、HP-Socket v5.7.1 完全兼容 HP-Socket v5.6.x 本,可以直接替换升级 [11:12 2019/09/02] > SSL 组件更新: ----------------- 1、所有 SSL 组件增加以下接口方法支持加载内存证书 1) Server:SetupSSLContextByMemory(), AddSSLContextByMemory() 2) Agent:SetupSSLContextByMemory() 3) Client:SetupSSLContextByMemory() 2、所有 SSL 组件增加 GetSSLSessionInfo() 方法,用来获取 SSL 会话相关信息 3、SSL Server 组件提供默认的 SNI 服务器域名绑定机制,大多数情形下应用程序不必自定义 SNI 回调函数 1) 当 SetupSSLContext() 的 'fnServerNameCallback' 参数值为 nullptr 则启用默认的服务器域名绑定机制 2) BindSSLServerName():绑定服务器域名到指定证书 3) HP_SSL_DefaultServerNameCallback():默认 SNI 回调函数 > HTTP 组件更新: ----------------- 1、HTTP Server 组件的 SendWSMessage() 方法删除 lpszMask 参数 2、所有 HTTP 组件的 SendWSMessage() 方法的 pData 参数类型改为 const BYTE*,因此可以传入常量 > UDP 组件更新: ----------------- 1、优化 Linux 平台的 UDP Cast 组件,使得其与 Windows 平台的 UDP Cast 组件保持行为一致 2、提升所有 UDP 组件(Server/Client/Cast)的 IPv6 兼容性 > 其他更新: ----------------- 1、jemalloc 升级到 5.2.1 本 2、代码优化,提高稳定性 > 升级说明: -----------
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值