开源一个lua的网络库

news/2024/7/9 19:06:46 标签: lua, epoll

以前曾经写过一篇为lua添加网络功能的博客,当然那篇文章提提供的lua网络接口纯粹是实验玩玩的,没有任何实用性.

今天突然又想起了这件事,想用前段时间写的KendyNet为lua提供一套网络接口.

这套接口是单线程的,通过PeekMsg获取网络事件,PeekMsg会在底层驱动epoll主循环.虽然也可以提供多线程的接口,

在下面启动一个线程来驱动epoll,将事件提交到消息队列,由PeekMsg获取。但是,没人有会指望用lua写一个高性能的

网络服务器,所以决定还是提供一个简单的接口,用来写写简单的小程序就可以了.

首先介绍一下向lua提供的接口:

lua_register(lState,"Connect",&luaConnect);                               //连接到远程服务器
lua_register(lState,"CloseConnection",&luaCloseConnection);    //销毁连接
lua_register(lState,"CreateNet",&luaCreateNet);                         //创建网络接口
lua_register(lState,"PeekMsg",&luaPeekMsg);                            //从消息队列提取事件
lua_register(lState,"CreateWpacket",&luaCreateWpacket);        //创建一个写包
lua_register(lState,"ReleaseRpacket",&luaReleaseRpacket);     //释放一个读包
lua_register(lState,"SendPacket",&luaSendPacket);                   //发送一个数据包
lua_register(lState,"PacketReadString",&luaPacketReadString);//从数据包中读取字符串

下面看一写用这套接口编写的echo服务器

echo.lua

local registernet = assert(package.loadlib("./luanet.so","RegisterNet"))  
registernet()
function mainloop()
    local netengine = CreateNet("127.0.0.1",8012)
    while true do
        local type,connection,rpacket = PeekMsg(netengine,50)
        if type then
            if type == 1 then
                print("a connection comming")
            elseif type == 3 then
                local wpkt = CreateWpacket(rpacket,0) 
                SendPacket(connection,wpkt)
                local msg = PacketReadString(rpacket)
                print(msg)
                ReleaseRpacket(rpacket)
            elseif type == 2 then
                print("disconnect")
                CloseConnection(connection)
            else
            end
        end
        
    end    
end    

mainloop()  

相当简单,首先是导入luanet.so动态库,并调用网络接口注册函数,然后在127.0.0.1的8012端口上创建一个网络引擎.

然后循环调用PeekMsg获取事件即可.

目前还有些小bug需要解决.

项目地址:https://github.com/sniperHW/luanet

要注意的是本项目依赖于kendylib,所以下载时请把kendylib也一起下载.

 测试下来性能还算满意,在我的 i5 双核 2.53G的笔记本上,建立200个连接,每秒发送17个包,服务器收到后转发给所有200个连接

转发包得数量在52W左右,平均延时在70-100之间,服务器CPU占用在不到单核心的50%.

 


http://www.niftyadmin.cn/n/1702765.html

相关文章

ASP.NET MVC与RAILS3的比较

进入后Web年代之后,MVC框架进入了快速演化的时代,Struts等垂垂老矣的老一代MVC框架因为开发效率低下而逐渐被抛弃,新一代的MVC则高举敏捷的大旗,逐渐占领市场,其中的代表有Rails (ruby), .NET MVC (.NET), Django (Pyt…

HDOJ 2206 IP的计算(正则表达式的应用)

Problem Description 在网络课程上,我学到了很多有关IP的知识。IP全称叫网际协议,有时我们又用IP来指代我们的IP网络地址,现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分&#xf…

php/mysql/jquery实现各系统流行的瀑布流显示方式

php/mysql/jquery实现各系统流行的瀑布流显示方式 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns"http://www.w3.org/1999/xhtml"><…

[Windows] 如何检测32位或64位的文件?

这几天在搞64位的windows编程&#xff0c;有时候需要知道所使用的dll或者lib是32 bit或者 64bit的 &#xff08;64 bit的程序无法调用32 bit的lib或dll)&#xff0c;最简单的方法是用windows下的工具dumpbin&#xff1a;[code] dumpbin /headers <filename> [/code]开头几…

HDU 1104 Remainder(BFS 同余定理)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid1104 在做这道题目一定要对同余定理有足够的了解&#xff0c;所以对这道题目对同余定理进行总结 首先要明白计算机里的取余计算和数学里的不一样的&#xff0c;计算机里的负数取余可以是负数的。例如-1%11-1 而数学里的取余…

javac

引用&#xff1a;http://hi.baidu.com/see_dream/blog/item/90525d0245dfbd044afb517a.html 用法&#xff1a;javac <选项> <源文件>其中&#xff0c;可能的选项包括&#xff1a;-g 生成所有调试信息-g:non…

【C++】PEXOPRTS 不工作了

迁移Posix下的一些工具常常需要用到MingW和VC一起工作&#xff0c;这时候PEXPORTS就帮上大忙了&#xff1a;我们可以先用MinGW编译出dll&#xff0c;然后用PEXPORTS导出def文件&#xff0c;最后用VC的LIB命令创建新的lib文件&#xff0c;VC程序就可以无缝地调用MingW的dll。迁移…

MPEG系列与H.26x系列标准

MPEG系列标准 H.26x系列标准 H.264的技术改进 (1)更加精细的宏块分割模式,运动估计的精度更高(1/4像素的亮度精度和1/8像素的色度精度) (2)整数DCT变换, 变换过程全部采用整数运算, 避免了浮点数运算过程中导致的错误积累, 降低了复杂度,并且正向的操作和逆向操作可以完全吻合…