12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- local skynet = require "skynet"
- local CMD = {}
- local SOCKET = {}
- local gate
- local agent = {}
- function SOCKET.open(fd, addr)
- skynet.error("New client from : " .. addr)
- agent[fd] = skynet.newservice("agent")
- skynet.call(agent[fd], "lua", "start", { gate = gate, client = fd, watchdog = skynet.self() })
- end
- local function close_agent(fd)
- local a = agent[fd]
- agent[fd] = nil
- if a then
- skynet.call(gate, "lua", "kick", fd)
- -- 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)
- end
- function CMD.start(conf)
- return skynet.call(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)
- gate = skynet.newservice("gate")
- end)
|