add socket.close_fd

This commit is contained in:
Cloud Wu
2015-12-06 16:48:28 +08:00
parent 3a2766dd0e
commit d4d188541f
4 changed files with 27 additions and 16 deletions

View File

@@ -19,7 +19,7 @@ function server.auth_handler(token)
user = crypt.base64decode(user) user = crypt.base64decode(user)
server = crypt.base64decode(server) server = crypt.base64decode(server)
password = crypt.base64decode(password) password = crypt.base64decode(password)
assert(password == "password") assert(password == "password", "Invalid password")
return server, user return server, user
end end

View File

@@ -49,9 +49,6 @@ end
local function launch_slave(auth_handler) local function launch_slave(auth_handler)
local function auth(fd, addr) local function auth(fd, addr)
skynet.error(string.format("connect from %s (fd = %d)", addr, fd))
socket.start(fd)
-- set socket buffer limit (8K) -- set socket buffer limit (8K)
-- If the attacker send large package, close the socket -- If the attacker send large package, close the socket
socket.limit(fd, 8192) socket.limit(fd, 8192)
@@ -86,24 +83,32 @@ local function launch_slave(auth_handler)
return ok, server, uid, secret return ok, server, uid, secret
end end
local function ret_pack(fd, ok, err, ...) local function ret_pack(ok, err, ...)
socket.abandon(fd)
if ok then if ok then
skynet.ret(skynet.pack(err, ...)) return skynet.pack(err, ...)
else else
if err == socket_error then if err == socket_error then
skynet.ret(skynet.pack(nil, "socket error")) return skynet.pack(nil, "socket error")
else else
skynet.ret(skynet.pack(false, err)) return skynet.pack(false, err)
end end
end end
end end
skynet.dispatch("lua", function(_,_,fd,...) local function auth_fd(fd, addr)
if type(fd) ~= "number" then skynet.error(string.format("connect from %s (fd = %d)", addr, fd))
skynet.ret(skynet.pack(false, "invalid fd type")) socket.start(fd) -- may raise error here
local msg, len = ret_pack(pcall(auth, fd, addr))
socket.abandon(fd) -- never raise error here
return msg, len
end
skynet.dispatch("lua", function(_,_,...)
local ok, msg, len = pcall(auth_fd, ...)
if ok then
return skynet.ret(msg,len)
else else
ret_pack(fd,pcall(auth, fd, ...)) return skynet.ret(skynet.pack(false, msg))
end end
end) end)
end end
@@ -113,7 +118,7 @@ local user_login = {}
local function accept(conf, s, fd, addr) local function accept(conf, s, fd, addr)
-- call slave auth -- call slave auth
local ok, server, uid, secret = skynet.call(s, "lua", fd, addr) local ok, server, uid, secret = skynet.call(s, "lua", fd, addr)
socket.start(fd) -- slave will accept(start) fd, so we can write to fd later
if not ok then if not ok then
if ok ~= nil then if ok ~= nil then
@@ -173,9 +178,8 @@ local function launch_master(conf)
if err ~= socket_error then if err ~= socket_error then
skynet.error(string.format("invalid client (fd = %d) error = %s", fd, err)) skynet.error(string.format("invalid client (fd = %d) error = %s", fd, err))
end end
socket.start(fd)
end end
socket.close(fd) socket.close_fd(fd) -- We haven't call socket.start, so use socket.close_fd rather than socket.close.
end) end)
end end

View File

@@ -227,6 +227,11 @@ function socket.shutdown(id)
close_fd(id, driver.shutdown) close_fd(id, driver.shutdown)
end end
function socket.close_fd(id)
assert(socket_pool[id] == nil,"Use socket.close instead")
driver.close(id)
end
function socket.close(id) function socket.close(id)
local s = socket_pool[id] local s = socket_pool[id]
if s == nil then if s == nil then

View File

@@ -841,10 +841,12 @@ start_socket(struct socket_server *ss, struct request_start *request, struct soc
result->data = "start"; result->data = "start";
return SOCKET_OPEN; return SOCKET_OPEN;
} else if (s->type == SOCKET_TYPE_CONNECTED) { } else if (s->type == SOCKET_TYPE_CONNECTED) {
// todo: maybe we should send a message SOCKET_TRANSFER to s->opaque
s->opaque = request->opaque; s->opaque = request->opaque;
result->data = "transfer"; result->data = "transfer";
return SOCKET_OPEN; return SOCKET_OPEN;
} }
// if s->type == SOCKET_TYPE_HALFCLOSE , SOCKET_CLOSE message will send later
return -1; return -1;
} }