原创 skynet:skynet.response

在前面的文章:skynet:session 中,已經使用過 skynet.ret / skynet.retpack 對消息進行應答。但這兩個函數有一個使用限制,即:消息接收與消息應答必須在同一個協程裏完成,也就是說:請求被哪一個協

原创 protobuf 如何解析(大於64MB)超大報文

爲了阻止惡意用戶發送超大報文,而導致int溢出或服務端爲解析報文而分配大量內存致使內存耗盡,protobuf規定int溢出的默認值閾值是64MB(理論是512MB)。因此,當調用ParseFromString(str)方法時,若s

原创 skynet:udp

skynet 爲 udp 協議做了有限的支持。和 tcp 協議不同,udp 協議不需要阻塞讀取。這是因爲 udp 是不可靠協議,無法預期下一個讀到的數據包是什麼(協議允許亂序和丟包),因此 skynet 的 udp 協議封裝採用的

原创 開機啓動C++實現

// 程序開機自動啓動 void autostart() { HKEY hKey; QString strRegPath = "SOFTWARE\\Microsoft\\Windows\\CurrentVersio

原创 skynet:服務重入問題

一個服務在接收到請求後,會對該請求進行處理,在處理的過程中,能同時接收並處理後到達的請求。 一、測試腳本 修改文章:skynet:session 中的測試腳本:echoluamsg.lua 與 testforkcall.lua:

原创 skynet:skynet.call() 失敗

skynet.call() 是一個阻塞函數,服務使用 skynet.call 發出請求後會等待應答,此時: 若響應服務退出(調用skynet.exit),會自動給未答覆的請求發送一個 error 消息,告訴它可以從 skyn

原创 skynet:TCP主動連接端

前面的文章講過,如何使用 socket 建立 tcp 監聽: #監聽指定地址:ip:port socket_id = socket.listen("ip:port") #當監聽到連接時,自定義函數:accept 會被觸發 soc

原创 skynet:fork

skynet 是多線程框架,此外在 skynet 中,每個服務對應一個 lua 虛擬機,一個虛擬機上可以跑多個協程,但同一時刻只能有一個協程,每條消息處理由協程來完成。 在 skynet 中,線程創建方式: skynet.for

原创 skynet:自帶網關服務

一、main() 啓動 watchdog examples/main.lua,會首先啓動一個 watchdog: local watchdog = skynet.newservice("watchdog") skynet.ca

原创 skynet:agent

gateserver 用於管理網絡連接,也可以讀取網絡數據,但它並沒有提供發送網絡數據相關的寫功能,而涉及請求處理與響應一般交給 agent 服務(agent 服務可以由一個普通服務來充當)。 一、agent 服務 myagent

原创 skynet:網關服務 二

一、控制客戶端連接數 在啓動網關時,可指定當前服務的最大連接數,以避免大量用戶登錄到該服務。 啓動網關服務後,運行三個 socketclient 客戶端,結果如下: 可以看到,第三個客戶端連接成功後,被立即關閉。 二、gate

原创 skynet 網關服務與封包/解包

TCP 是基於數據流的,但一般需要以帶長度信息的數據包來做數據交換,skynet 提供了一個通用模板 lualib/snax/gateserver.lua 來啓動一個網關服務器,gateserver 做的就是這個工作。 一、編寫網

原创 skynet:httpserver 研究

skynet.newservice(name),用於創建新服務,會調用服務初始化函數:skynet.start(); skynet.call(“服務名”,“lua”,“方法名(函數名)”,參數1、參數2…):向指定服務

原创 skynet:調用c模塊

一、定義 c 模塊 #include <lua.h> #include <lauxlib.h> static int add(lua_State *L) { float a1 = lua_tonumber(L, 1);

原创 skynet:服務間發送消息

skynet 是單進程多線程框架,每個 lua service 獨立運行在自己的 lua vm 裏,而本篇文章要實現的是讓一個 service 發送消息,另一個 service 處理消息。 一、skynet 啓動新 service