You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

80 lines
1.7 KiB
Lua

local skynet = require "skynet"
local CMD = {}
local SOCKET = {}
local master_gate
local agent = {}
local protocol
local fd2gate = {}
function SOCKET.open(fd, addr, gate)
skynet.error("New client from : " .. addr)
fd2gate[fd] = gate
agent[fd] = skynet.newservice("ws_agent")
skynet.call(agent[fd], "lua", "start", {
gate = gate,
client = fd,
watchdog = skynet.self(),
protocol = protocol,
addr = addr,
})
end
local function close_agent(fd)
local a = agent[fd]
agent[fd] = nil
if a then
local gate = fd2gate[fd]
if gate then
skynet.call(gate, "lua", "kick", fd)
fd2gate[fd] = nil
end
-- disconnect never return
skynet.send(a, "lua", "disconnect")
end
end
function SOCKET.close(fd)
print("socket close",fd)
close_agent(fd)
end
function SOCKET.error(fd, msg)
print("socket error",fd, msg)
close_agent(fd)
end
function SOCKET.warning(fd, size)
-- size K bytes havn't send out in fd
print("socket warning", fd, size)
end
function SOCKET.data(fd, msg)
print("socket data", fd, msg)
end
function CMD.start(conf)
protocol = conf.protocol
skynet.call(master_gate, "lua", "open" , conf)
end
function CMD.close(fd)
close_agent(fd)
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)
master_gate = skynet.newservice("ws_gate")
end)