luasocket/samples/tinyirc.lua

73 lines
1.9 KiB
Lua
Raw Normal View History

2001-03-12 20:42:46 +01:00
function set_add(set, sock)
tinsert(set, sock)
end
function set_remove(set, sock)
for i = 1, getn(set) do
if set[i] == sock then
tremove(set, i)
break
end
end
end
host = host or "*"
port1 = port1 or 8080
port2 = port2 or 8081
if arg then
host = arg[1] or host
port1 = arg[2] or port1
port2 = arg[3] or port2
end
2002-07-08 22:56:36 +02:00
server1, error = bind(host, port1)
if not server1 then print(error) exit() end
2001-03-12 20:42:46 +01:00
server1:timeout(1)
2002-07-08 22:56:36 +02:00
server2, error = bind(host, port2)
if not server2 then print(error) exit() end
2001-03-12 20:42:46 +01:00
server2:timeout(1)
2002-07-08 22:56:36 +02:00
sock_set = {server1, server2}
sock_id = {}
sock_id[server1] = 1
sock_id[server2] = 2
next_id = 3
2001-03-12 20:42:46 +01:00
while 1 do
2002-07-08 22:56:36 +02:00
local readable, _, error = select(sock_set, nil)
for _, sock in readable do
-- is it a server socket
if sock_id[sock] < 3 then
local incomming = sock:accept()
if incomming then
incomming:timeout(1)
sock_id[incomming] = next_id
set_add(sock_set, incomming)
write("Added client id ", next_id, ". ",
getn(sock_set)-2, " total.\n")
next_id = next_id + 1
2001-03-12 20:42:46 +01:00
end
2002-07-08 22:56:36 +02:00
-- it is a client socket
2001-03-12 20:42:46 +01:00
else
2002-07-08 22:56:36 +02:00
local line, error = sock:receive()
local id = sock_id[sock]
if error then
sock:close()
set_remove(sock_set, sock)
write("Removed client number ", id, ". ",
getn(sock_set)-2, " total.\n")
2001-03-12 20:42:46 +01:00
else
2002-07-08 22:56:36 +02:00
write("Broadcasting line '", id, "> ", line, "'.\n")
_, writable, error = select(nil, sock_set, 1)
if not error then
for _, outgoing in writable do
write("Sending to client ", sock_id[outgoing], "\n")
outgoing:send(id, "> ", line, "\r\n")
end
2002-07-08 22:56:36 +02:00
else write("No one ready to listen!!!\n") end
end
2001-03-12 20:42:46 +01:00
end
end
end