------------------------------------------------------------------------------- LuaSocket helper module-- Author: Diego Nehab------------------------------------------------------------------------------------------------------------------------------------------------------------ Declare module and import dependencies-----------------------------------------------------------------------------local base = _Glocal string = require("string")local math = require("math")local socket = require("socket.core")local _M = socket------------------------------------------------------------------------------- Exported auxiliar functions-----------------------------------------------------------------------------function _M.connect4(address, port, laddress, lport)return socket.connect(address, port, laddress, lport, "inet")endfunction _M.connect6(address, port, laddress, lport)return socket.connect(address, port, laddress, lport, "inet6")endfunction _M.bind(host, port, backlog)if host == "*" then host = "0.0.0.0" endlocal addrinfo, err = socket.dns.getaddrinfo(host);if not addrinfo then return nil, err endlocal sock, reserr = "no info on address"for i, alt in base.ipairs(addrinfo) doif alt.family == "inet" thensock, err = socket.tcp()elsesock, err = socket.tcp6()endif not sock then return nil, err endsock:setoption("reuseaddr", true)res, err = sock:bind(alt.addr, port)if not res thensock:close()elseres, err = sock:listen(backlog)if not res thensock:close()elsereturn sockendendendreturn nil, errend_M.try = _M.newtry()function _M.choose(table)return function(name, opt1, opt2)if base.type(name) ~= "string" thenname, opt1, opt2 = "default", name, opt1endlocal f = table[name or "nil"]if not f then base.error("unknown key (".. base.tostring(name) ..")", 3)else return f(opt1, opt2) endendend------------------------------------------------------------------------------- Socket sources and sinks, conforming to LTN12------------------------------------------------------------------------------- create namespaces inside LuaSocket namespacelocal sourcet, sinkt = {}, {}_M.sourcet = sourcet_M.sinkt = sinkt_M.BLOCKSIZE = 2048sinkt["close-when-done"] = function(sock)return base.setmetatable({getfd = function() return sock:getfd() end,dirty = function() return sock:dirty() end}, {__call = function(self, chunk, err)if not chunk thensock:close()return 1else return sock:send(chunk) endend})endsinkt["keep-open"] = function(sock)return base.setmetatable({getfd = function() return sock:getfd() end,dirty = function() return sock:dirty() end}, {__call = function(self, chunk, err)if chunk then return sock:send(chunk)else return 1 endend})endsinkt["default"] = sinkt["keep-open"]_M.sink = _M.choose(sinkt)sourcet["by-length"] = function(sock, length)return base.setmetatable({getfd = function() return sock:getfd() end,dirty = function() return sock:dirty() end}, {__call = function()if length <= 0 then return nil endlocal size = math.min(socket.BLOCKSIZE, length)local chunk, err = sock:receive(size)if err then return nil, err endlength = length - string.len(chunk)return chunkend})endsourcet["until-closed"] = function(sock)local donereturn base.setmetatable({getfd = function() return sock:getfd() end,dirty = function() return sock:dirty() end}, {__call = function()if done then return nil endlocal chunk, err, partial = sock:receive(socket.BLOCKSIZE)if not err then return chunkelseif err == "closed" thensock:close()done = 1return partialelse return nil, err endend})endsourcet["default"] = sourcet["until-closed"]_M.source = _M.choose(sourcet)return _M
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。