luanet:一個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需要解決.