diff options
-rw-r--r-- | samples/tinyirc.lua | 71 |
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 |
21 | end | 21 | end |
22 | 22 | ||
23 | server1 = bind(host, port1) | 23 | server1, error = bind(host, port1) |
24 | if not server1 then print(error) exit() end | ||
24 | server1:timeout(1) | 25 | server1:timeout(1) |
25 | server1.is_server = 1 | 26 | server2, error = bind(host, port2) |
26 | server2 = bind(host, port2) | 27 | if not server2 then print(error) exit() end |
27 | server2:timeout(1) | 28 | server2:timeout(1) |
28 | server2.is_server = 1 | ||
29 | 29 | ||
30 | set = {server1, server2} | 30 | sock_set = {server1, server2} |
31 | number = 1 | 31 | |
32 | sock_id = {} | ||
33 | sock_id[server1] = 1 | ||
34 | sock_id[server2] = 2 | ||
35 | next_id = 3 | ||
32 | 36 | ||
33 | while 1 do | 37 | while 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 |