luanet:一個lua的網絡庫

openkk 12年前發布 | 70K 次閱讀 Lua 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

 本文由用戶 openkk 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!