Better connection handling.

This commit is contained in:
Diego Nehab 2005-04-21 03:15:34 +00:00
parent 4e3cf63c95
commit 434e8e014c
4 changed files with 26 additions and 16 deletions

View file

@ -76,13 +76,13 @@ function connect(who, host, port)
if not ret and err == "timeout" then
wait(who, "output")
ret, err = who:connect(host, port)
if not ret and err ~= "already connected" then
kick(who)
kick(context[who].peer)
return
end
end
if not ret then
kick(who)
kick(context[who].peer)
else
return forward(who)
end
return forward(who)
end
-- gets rid of a client

View file

@ -24,20 +24,29 @@ io.write("Servers bound\n")
-- simple set implementation
-- the select function doesn't care about what is passed to it as long as
-- it behaves like a table
-- creates a new set data structure
function newset()
local reverse = {}
local set = {}
setmetatable(set, { __index = {
insert = function(set, value)
table.insert(set, value)
reverse[value] = table.getn(set)
return setmetatable(set, {__index = {
insert = function(set, value)
if not reverse[value] then
table.insert(set, value)
reverse[value] = table.getn(set)
end
end,
remove = function(set, value)
table.remove(set, reverse[value])
reverse[value] = nil
end,
local index = reverse[value]
if index then
reverse[value] = nil
local top = table.remove(set)
if top ~= value then
reverse[top] = index
set[index] = top
end
end
end
}})
return set
end
set = newset()