beta-0.89.2
[luatex.git] / source / texk / web2c / luatexdir / luasocket / samples / tinyirc.lua
blob5babb7e1ea1dbd3045a4b049a040ecb1eb2bea9c
1 -----------------------------------------------------------------------------
2 -- Select sample: simple text line server
3 -- LuaSocket sample files.
4 -- Author: Diego Nehab
5 -----------------------------------------------------------------------------
6 local socket = require("socket")
7 host = host or "*"
8 port1 = port1 or 8080
9 port2 = port2 or 8181
10 if arg then
11 host = arg[1] or host
12 port1 = arg[2] or port1
13 port2 = arg[3] or port2
14 end
16 server1 = assert(socket.bind(host, port1))
17 server2 = assert(socket.bind(host, port2))
18 server1:settimeout(1) -- make sure we don't block in accept
19 server2:settimeout(1)
21 io.write("Servers bound\n")
23 -- simple set implementation
24 -- the select function doesn't care about what is passed to it as long as
25 -- it behaves like a table
26 -- creates a new set data structure
27 function newset()
28 local reverse = {}
29 local set = {}
30 return setmetatable(set, {__index = {
31 insert = function(set, value)
32 if not reverse[value] then
33 table.insert(set, value)
34 reverse[value] = #set
35 end
36 end,
37 remove = function(set, value)
38 local index = reverse[value]
39 if index then
40 reverse[value] = nil
41 local top = table.remove(set)
42 if top ~= value then
43 reverse[top] = index
44 set[index] = top
45 end
46 end
47 end
48 }})
49 end
51 set = newset()
53 io.write("Inserting servers in set\n")
54 set:insert(server1)
55 set:insert(server2)
57 while 1 do
58 local readable, _, error = socket.select(set, nil)
59 for _, input in ipairs(readable) do
60 -- is it a server socket?
61 if input == server1 or input == server2 then
62 io.write("Waiting for clients\n")
63 local new = input:accept()
64 if new then
65 new:settimeout(1)
66 io.write("Inserting client in set\n")
67 set:insert(new)
68 end
69 -- it is a client socket
70 else
71 local line, error = input:receive()
72 if error then
73 input:close()
74 io.write("Removing client from set\n")
75 set:remove(input)
76 else
77 io.write("Broadcasting line '", line, "'\n")
78 writable, error = socket.skip(1, socket.select(nil, set, 1))
79 if not error then
80 for __, output in ipairs(writable) do
81 if output ~= input then
82 output:send(line .. "\n")
83 end
84 end
85 else io.write("No client ready to receive!!!\n") end
86 end
87 end
88 end
89 end