| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- --[[
- @module tcp_server_receiver
- @summary tcp server socket数据接收应用功能模块
- @version 1.0
- @date 2025.11.15
- @author 王世豪
- @usage
- 本文件为tcp server 数据接收应用功能模块,核心业务逻辑为:
- 从内核读取接收到的数据,然后将数据发送给其他应用功能模块做进一步处理;
- 本文件的对外接口有2个:
- 1、tcp_server_receiver.proc(netc):数据接收应用逻辑处理入口,在tcp_server_main.lua中调用;
- 2、sys.publish("RECV_DATA_FROM_CLIENT", data):
- 将接收到的数据通过消息"RECV_DATA_FROM_CLIENT"发布出去;
- 需要处理数据的应用功能模块订阅处理此消息即可,本demo项目中uart_app.lua中订阅处理了本消息;
- ]]
- local tcp_server_receiver = {}
- -- socket数据接收缓冲区
- local recv_buff = nil
- --[[
- 检查socket server是否收到数据,如果收到数据,读取并且处理完所有数据
- @api tcp_server_receiver.proc(netc)
- @param1 netc userdata
- 表示由socket.create接口创建的socket server对象;
- 必须传入,不允许为空或者nil;
- @return1 result bool
- 表示处理结果,成功为true,失败为false
- @usage
- -- 示例:处理tcp server接收数据
- tcp_server_receiver.proc(netc)
- ]]
- function tcp_server_receiver.proc(netc)
- -- 如果socket数据接收缓冲区还没有申请过空间,则先申请内存空间
- if recv_buff==nil then
- recv_buff = zbuff.create(1024)
- -- 当recv_buff不再使用时,不需要主动调用recv_buff:free()去释放
- -- 因为Lua的垃圾处理器会自动释放recv_buff所申请的内存空间
- -- 如果等不及垃圾处理器自动处理,在确定以后不会再使用recv_buff时,则可以主动调用recv_buff:free()释放内存空间
- end
- -- 循环从内核的缓冲区读取接收到的数据
- -- 如果读取失败,返回false,退出循环
- -- 如果读取成功,处理数据,并且继续循环读取
- -- 如果读取成功,并且读出来的数据为空,表示已经没有数据可读,返回true,退出循环
- while true do
- -- 从内核的缓冲区中读取数据到recv_buff中
- local succ, param = socket.rx(netc, recv_buff)
- -- 读取数据失败
- -- 有两种情况:
- -- 1、recv_buff扩容失败
- -- 2、socket server和client之间的连接断开
- if not succ then
- log.info("tcp_server_receiver.proc", "socket.rx error", param)
- return false
- end
- -- 如果读取到了数据, used()就必然大于0, 进行处理
- if recv_buff:used() > 0 then
- log.info("tcp_server_receiver.proc", "recv data len", recv_buff:used())
-
- -- 读取socket数据接收缓冲区中的数据,赋值给data
- local data = recv_buff:query()
- log.info("tcp_server_receiver.proc", "recv data", data)
- -- 将数据通过"RECV_DATA_FROM_CLIENT"消息publish出去,给其他应用模块处理
- sys.publish("RECV_DATA_FROM_CLIENT", data)
- -- 清空socket数据接收缓冲区中的数据
- recv_buff:del()
- else
- -- 读取成功,但是读出来的数据为空,表示已经没有数据可读,可以退出循环了
- break
- end
- end
- return true
- end
- return tcp_server_receiver
|