----------------------------------------------------------------------------- -- Select sample: simple text line server -- LuaSocket sample files. -- Author: Diego Nehab -- RCS ID: $Id: tinyirc.lua,v 1.14 2005/11/22 08:33:29 diego Exp $ ----------------------------------------------------------------------------- local socket = require("socket") host = host or "*" port1 = port1 or 8080 port2 = port2 or 8181 if arg then host = arg[1] or host port1 = arg[2] or port1 port2 = arg[3] or port2 end server1 = assert(socket.bind(host, port1)) server2 = assert(socket.bind(host, port2)) server1:settimeout(1) -- make sure we don't block in accept server2:settimeout(1) io.write("Servers bound\n") -- simple set implementation -- the select function doesn't care about what is passed to it as long as -- it behaves like a table -- creates a new set data structure function newset() local reverse = {} local set = {} return setmetatable(set, {__index = { insert = function(set, value) if not reverse[value] then table.insert(set, value) reverse[value] = table.getn(set) end end, remove = function(set, value) local index = reverse[value] if index then reverse[value] = nil local top = table.remove(set) if top ~= value then reverse[top] = index set[index] = top end end end }}) end set = newset() io.write("Inserting servers in set\n") set:insert(server1) set:insert(server2) while 1 do local readable, _, error = socket.select(set, nil) for _, input in ipairs(readable) do -- is it a server socket? if input == server1 or input == server2 then io.write("Waiting for clients\n") local new = input:accept() if new then new:settimeout(1) io.write("Inserting client in set\n") set:insert(new) end -- it is a client socket else local line, error = input:receive() if error then input:close() io.write("Removing client from set\n") set:remove(input) else io.write("Broadcasting line '", line, "'\n") writable, error = socket.skip(1, socket.select(nil, set, 1)) if not error then for __, output in ipairs(writable) do if output ~= input then output:send(line .. "\n") end end else io.write("No client ready to receive!!!\n") end end end end end