aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--samples/tinyirc.lua71
1 files changed, 37 insertions, 34 deletions
diff --git a/samples/tinyirc.lua b/samples/tinyirc.lua
index f38ab73..b0c4168 100644
--- a/samples/tinyirc.lua
+++ b/samples/tinyirc.lua
@@ -20,49 +20,52 @@ if arg then
20 port2 = arg[3] or port2 20 port2 = arg[3] or port2
21end 21end
22 22
23server1 = bind(host, port1) 23server1, error = bind(host, port1)
24if not server1 then print(error) exit() end
24server1:timeout(1) 25server1:timeout(1)
25server1.is_server = 1 26server2, error = bind(host, port2)
26server2 = bind(host, port2) 27if not server2 then print(error) exit() end
27server2:timeout(1) 28server2:timeout(1)
28server2.is_server = 1
29 29
30set = {server1, server2} 30sock_set = {server1, server2}
31number = 1 31
32sock_id = {}
33sock_id[server1] = 1
34sock_id[server2] = 2
35next_id = 3
32 36
33while 1 do 37while 1 do
34 local r, s, e, l, n 38 local readable, _, error = select(sock_set, nil)
35 r, _, e = select(set, nil) 39 for _, sock in readable do
36 for i, v in r do 40 -- is it a server socket
37 if v.is_server then 41 if sock_id[sock] < 3 then
38 s = v:accept() 42 local incomming = sock:accept()
39 if s then 43 if incomming then
40 s:timeout(1) 44 incomming:timeout(1)
41 s.number = number 45 sock_id[incomming] = next_id
42 number = number + 1 46 set_add(sock_set, incomming)
43 set_add(set, s) 47 write("Added client id ", next_id, ". ",
44 write("Added client number ", s.number, ". ", 48 getn(sock_set)-2, " total.\n")
45 getn(set)-2, " total.\n") 49 next_id = next_id + 1
46 end 50 end
51 -- it is a client socket
47 else 52 else
48 l, e = v:receive() 53 local line, error = sock:receive()
49 n = v.number 54 local id = sock_id[sock]
50 if e then 55 if error then
51 v:close() 56 sock:close()
52 set_remove(set, v) 57 set_remove(sock_set, sock)
53 write("Removed client number ", n, ". ", 58 write("Removed client number ", id, ". ",
54 getn(set)-2, " total.\n") 59 getn(sock_set)-2, " total.\n")
55 else 60 else
56 write("Broadcasting line '", tostring(n), "> ", 61 write("Broadcasting line '", id, "> ", line, "'.\n")
57 tostring(l), "'.\n") 62 _, writable, error = select(nil, sock_set, 1)
58 _, s, e = select(nil, set, 1) 63 if not error then
59 if not e then 64 for _, outgoing in writable do
60 for i,v in s do 65 write("Sending to client ", sock_id[outgoing], "\n")
61 v:send(tostring(n), "> ", l, "\r\n") 66 outgoing:send(id, "> ", line, "\r\n")
62 end 67 end
63 else 68 else write("No one ready to listen!!!\n") end
64 write("No one ready to listen!!!\n")
65 end
66 end 69 end
67 end 70 end
68 end 71 end