lk.Socket2
:accept (func)
require 'lk.Socket_core' constr = lk.Socket local lib = lk.SubClass(lk.Socket) lk.Socket = lib
lib.type = 'lk.Socket' lib.TCP = lk.Socket_const.TCP lib.UDP = lk.Socket_const.UDP
local self = constr(lib.TCP) assert(func) self.thread = sched:thread(function() func(self) end) return setmetatable(self, lib) end
self.host = host self.port = self.super:bind(host, port) self.super:setNonBlocking() sched:addFd(self.thread, self.super:fd()) return self.port end
local buffer = self.buffer while true do if buffer then local line, rest = string.match(buffer, '([^\r\n])\r?\n(.)') if line then self.buffer = rest return line end end sched:waitRead(self.sock_fd) local data = self.super:recv('*a') if buffer then buffer = buffer .. data else buffer = data end end end
local buffer = data while true do local sent = self.super:send(data) if sent == string.len(data) then break else data = string.sub(data, sent + 1) end sched:waitWrite(self.sock_fd) end end
assert(func) sched:waitRead(self.sock_fd) local cli = self.super:accept() cli.super:setNonBlocking() cli.sock_fd = cli:fd() -- start new thread cli.thread = sched:thread(function() func(cli) end) sched:addFd(cli.thread, cli.super:fd()) return setmetatable(cli, lib) end --[[ --=============================================== ???? old stuff local function checkLoop(self) if not self.loop then error("Loop not set") end end
function mt:shouldRun() checkLoop(self) return self.loop:shouldRun() end
function mt:start() checkLoop(self) self.loop:start() end
function mt:quit() checkLoop(self) self.loop:quit() end
function mt:kill() checkLoop(self) self.loop:kill() end
function mt:join() checkLoop(self) self.loop:join() end