local skynet = require "skynet" require "skynet.manager" local redisproxy = require "shared.redisproxy" local socket = require "skynet.socket" local netpack = require "skynet.netpack" local datacenter = require "skynet.datacenter" local snax = require "skynet.snax" local agent_ctrl = require "services.agent_ctrl" local xxtea = require "xxtea" local mc = require "skynet.multicast" require "ProtocolCode" require "GlobalVar" require "shared.init" require "utils.init" local CMD, SOCKET = {}, {} local globald local pool_size = tonumber(...) function SOCKET.open(fd, addr) skynet.call(gate_serv, "lua", "accept" , fd) agent_ctrl:socket_open(fd, addr) end function SOCKET.close(fd) print("socket close", fd) agent_ctrl:socket_close(fd) end function SOCKET.error(fd, msg) print("socket error",fd, msg) agent_ctrl:socket_error(fd) end function SOCKET.data(fd, msg) local cmd = string.unpack("H", string.sub(msg, 1, 2)) if cmd == actionCodes.Role_queryLoginRpc then local data = MsgPack.unpack(xxtea.decrypt(string.sub(msg, 3), XXTEA_KEY)) -- TODO: 先检测uid的合法性 if not data or not data.uid then return end agent_ctrl:query_agent(fd, data.uid) end end local use_logd = tonumber(skynet.getenv "logd") -- @desc: agent状态定时检测 function check_agent_status() pcall(agent_ctrl.check_agent_status, agent_ctrl) skynet.timeout(1, check_agent_status) end -- 创建world以及union channel 用于广播 function create_mutilcast() for i = 1, 10 do local chan_w = mc:new() datacenter.set("MC_W_CHANNEL" .. i, chan_w.channel) end end function CMD.start(conf) skynet.call(gate_serv, "lua", "open" , conf) skynet.call(redisd, "lua", "open", conf) if use_logd == 1 then skynet.call(logd, "lua", "open", conf) end -- 开启agent状态检测定时器 check_agent_status() -- 创建广播服务 create_mutilcast() skynet.call(conf.ngxd, "lua", "start") skynet.call(conf.httpd, "lua", "start") -- roomServer = skynet.newservice("services/roomServer") -- skynet.call(roomServer, "lua", "start") globald = skynet.newservice("services/globald") skynet.call(globald, "lua", "start") skynet.newservice("services/dbseed") end function CMD.forceClose(fd) agent_ctrl:exit_agent(fd) end function CMD.hotfix(code) agent_ctrl:hotfix(code) end skynet.start(function() skynet.dispatch("lua", function(session, source, cmd, subcmd, ...) if cmd == "socket" then local f = SOCKET[subcmd] f(...) -- socket api don't need return else local f = assert(CMD[cmd]) skynet.ret(skynet.pack(f(subcmd, ...))) end end) skynet.register "WATCHDOG" -- 数据库服务 redisd = skynet.newservice("services/redisd") -- load all csv data skynet.newservice("services/csvdatad") print("launch csvdatad ...") -- 日志服务 if use_logd == 1 then logd = skynet.newservice("services/logd") end local poold = skynet.newservice("services/poold") local obj = skynet.call(poold, "lua", "start", pool_size) agent_ctrl:init(obj, poold) print(string.format("launch %d agent at the beginning", pool_size)) -- 全局工具函数 skynet.newservice("services/named") skynet.newservice("services/chated") -- 网关服务 gate_serv = skynet.newservice("gate") end)