開源一個lua的網絡庫


以前曾經寫過一篇為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%.

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM