1 -----------------------------------------------------------------------------
2 -- Select sample: simple text line server
3 -- LuaSocket sample files.
5 -----------------------------------------------------------------------------
6 local socket
= require("socket")
12 port1
= arg
[2] or port1
13 port2
= arg
[3] or port2
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
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
30 return setmetatable(set
, {__index
= {
31 insert
= function(set
, value
)
32 if not reverse
[value
] then
33 table.insert(set
, value
)
37 remove = function(set
, value
)
38 local index
= reverse
[value
]
41 local top
= table.remove(set
)
53 io
.write("Inserting servers in set\n")
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()
66 io
.write("Inserting client in set\n")
69 -- it is a client socket
71 local line
, error = input
:receive()
74 io
.write("Removing client from set\n")
77 io
.write("Broadcasting line '", line
, "'\n")
78 writable
, error = socket
.skip(1, socket
.select(nil, set
, 1))
80 for __
, output
in ipairs(writable
) do
81 if output
~= input
then
82 output
:send(line
.. "\n")
85 else io
.write("No client ready to receive!!!\n") end