aboutsummaryrefslogtreecommitdiff
path: root/samples/tinyirc.lua
diff options
context:
space:
mode:
authorDiego Nehab <diego@tecgraf.puc-rio.br>2003-06-09 18:23:40 +0000
committerDiego Nehab <diego@tecgraf.puc-rio.br>2003-06-09 18:23:40 +0000
commit58bdb658aaa1c30a8f3bed46eef880d308fae582 (patch)
tree5bf880c715daff79c1a2062f2f3ae8336858c83f /samples/tinyirc.lua
parentb2724ad2d1cc3768a04270ed3f8014ec65ad133b (diff)
downloadluasocket-58bdb658aaa1c30a8f3bed46eef880d308fae582.tar.gz
luasocket-58bdb658aaa1c30a8f3bed46eef880d308fae582.tar.bz2
luasocket-58bdb658aaa1c30a8f3bed46eef880d308fae582.zip
Select re-implemented in a nicer way.
Few changes in internal class and group registration. Lua modules are compiled and built into library. Dynamic library tested in Linux and Mac OS X.
Diffstat (limited to 'samples/tinyirc.lua')
-rw-r--r--samples/tinyirc.lua90
1 files changed, 48 insertions, 42 deletions
diff --git a/samples/tinyirc.lua b/samples/tinyirc.lua
index d3e56e7..0b20303 100644
--- a/samples/tinyirc.lua
+++ b/samples/tinyirc.lua
@@ -1,16 +1,9 @@
1function set_add(set, sock) 1-----------------------------------------------------------------------------
2 table.insert(set, sock) 2-- Select sample: simple text line server
3end 3-- LuaSocket 1.5 sample files.
4 4-- Author: Diego Nehab
5function set_remove(set, sock) 5-- RCS ID: $Id$
6 for i = 1, table.getn(set) do 6-----------------------------------------------------------------------------
7 if set[i] == sock then
8 table.remove(set, i)
9 break
10 end
11 end
12end
13
14host = host or "*" 7host = host or "*"
15port1 = port1 or 8080 8port1 = port1 or 8080
16port2 = port2 or 8081 9port2 = port2 or 8081
@@ -21,49 +14,62 @@ if arg then
21end 14end
22 15
23server1, error = socket.bind(host, port1) 16server1, error = socket.bind(host, port1)
24if not server1 then print(error) exit() end 17assert(server1, error)
25server1:timeout(1) 18server1:timeout(1)
26server2, error = socket.bind(host, port2) 19server2, error = socket.bind(host, port2)
27if not server2 then print(error) exit() end 20assert(server2, error)
28server2:timeout(1) 21server2:timeout(1)
29 22
30sock_set = {server1, server2} 23function newset()
24 local reverse = {}
25 local set = {}
26 setmetatable(set, { __index = {
27 insert = function(set, value)
28 table.insert(set, value)
29 reverse[value] = table.getn(set)
30 end,
31 remove = function(set, value)
32 table.remove(set, reverse[value])
33 reverse[value] = nil
34 end,
35 id = function(set, value)
36 return reverse[value]
37 end
38 }})
39 return set
40end
41
42sockets = newset()
31 43
32sock_id = {} 44sockets:insert(server1)
33sock_id[server1] = 1 45sockets:insert(server2)
34sock_id[server2] = 2
35next_id = 3
36 46
37while 1 do 47while 1 do
38 local readable, _, error = socket.select(sock_set, nil) 48 local readable, _, error = socket.select(sockets, nil)
39 for _, sock in readable do 49 for _, input in readable do
40 -- is it a server socket 50 -- is it a server socket?
41 if sock_id[sock] < 3 then 51 local id = sockets:id(input)
42 local incomming = sock:accept() 52 if input == server1 or input == server2 then
43 if incomming then 53 local new = input:accept()
44 incomming:timeout(1) 54 if new then
45 sock_id[incomming] = next_id 55 new:timeout(1)
46 set_add(sock_set, incomming) 56 sockets:insert(new)
47 io.write("Added client id ", next_id, ". ", 57 io.write("Server ", id, " got client ", sockets:id(new), "\n")
48 table.getn(sock_set)-2, " total.\n")
49 next_id = next_id + 1
50 end 58 end
51 -- it is a client socket 59 -- it is a client socket
52 else 60 else
53 local line, error = sock:receive() 61 local line, error = input:receive()
54 local id = sock_id[sock]
55 if error then 62 if error then
56 sock:close() 63 input:close()
57 set_remove(sock_set, sock) 64 io.write("Removing client ", id, "\n")
58 io.write("Removed client number ", id, ". ", 65 sockets:remove(input)
59 getn(sock_set)-2, " total.\n")
60 else 66 else
61 io.write("Broadcasting line '", id, "> ", line, "'.\n") 67 io.write("Broadcasting line '", id, "> ", line, "'.\n")
62 __, writable, error = socket.select(nil, sock_set, 1) 68 __, writable, error = socket.select(nil, sockets, 1)
63 if not error then 69 if not error then
64 for ___, outgoing in writable do 70 for ___, output in writable do
65 io.write("Sending to client ", sock_id[outgoing], "\n") 71 io.write("Sending to client ", sockets:id(output), "\n")
66 outgoing:send(id, "> ", line, "\r\n") 72 output:send(id, "> ", line, "\r\n")
67 end 73 end
68 else io.write("No one ready to listen!!!\n") end 74 else io.write("No one ready to listen!!!\n") end
69 end 75 end