diff samples/tinyirc.lua @ 0:4b915342e2a8

LuaSocket 2.0.2 + CMake build description.
author Eric Wing <ewing . public |-at-| gmail . com>
date Tue, 26 Aug 2008 18:40:01 -0700
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/samples/tinyirc.lua	Tue Aug 26 18:40:01 2008 -0700
@@ -0,0 +1,90 @@
+-----------------------------------------------------------------------------
+-- 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