From c8197328a4a17b5b1ec6cbac5bb36acb876558d1 Mon Sep 17 00:00:00 2001 From: Cloud Wu Date: Sun, 4 Sep 2022 00:13:49 +0800 Subject: [PATCH] socket.listen returns addr,port --- lualib/skynet/socket.lua | 21 ++++++++++++++++++--- lualib/snax/loginserver.lua | 2 +- service/cslave.lua | 5 +---- service/debug_console.lua | 2 +- skynet-src/socket_server.c | 23 ++++++++++++++++++++++- 5 files changed, 43 insertions(+), 10 deletions(-) diff --git a/lualib/skynet/socket.lua b/lualib/skynet/socket.lua index 2c44d052..259fa98d 100644 --- a/lualib/skynet/socket.lua +++ b/lualib/skynet/socket.lua @@ -103,13 +103,17 @@ socket_message[1] = function(id, size, data) end -- SKYNET_SOCKET_TYPE_CONNECT = 2 -socket_message[2] = function(id, _ , addr) +socket_message[2] = function(id, ud , addr) local s = socket_pool[id] if s == nil then return end -- log remote addr if not s.connected then -- resume may also post connect message + if s.listen then + s.addr = addr + s.port = ud + end s.connected = true wakeup(s) end @@ -220,7 +224,10 @@ local function connect(id, func) protocol = "TCP", } assert(not socket_onclose[id], "socket has onclose callback") - assert(not socket_pool[id], "socket is not closed") + local s2 = socket_pool[id] + if s2 and not s2.listen then + error("socket is not closed") + end socket_pool[id] = s suspend(s) local err = s.connecting @@ -404,7 +411,15 @@ function socket.listen(host, port, backlog) host, port = string.match(host, "([^:]+):(.+)$") port = tonumber(port) end - return driver.listen(host, port, backlog) + local id = driver.listen(host, port, backlog) + local s = { + id = id, + connected = false, + listen = true, + } + socket_pool[id] = s + suspend(s) + return id, s.addr, s.port end -- abandon use to forward socket id to other service diff --git a/lualib/snax/loginserver.lua b/lualib/snax/loginserver.lua index 7ea36b21..d672e479 100644 --- a/lualib/snax/loginserver.lua +++ b/lualib/snax/loginserver.lua @@ -177,7 +177,7 @@ local function launch_master(conf) skynet.error(string.format("invalid client (fd = %d) error = %s", fd, err)) end end - socket.close_fd(fd) -- We haven't call socket.start, so use socket.close_fd rather than socket.close. + socket.close(fd) end) end diff --git a/service/cslave.lua b/service/cslave.lua index daed0116..4362824b 100644 --- a/service/cslave.lua +++ b/service/cslave.lua @@ -263,11 +263,8 @@ skynet.start(function() end end) skynet.wait() - socket.close(slave_fd) - else - -- slave_fd does not start, so use close_fd. - socket.close_fd(slave_fd) end + socket.close(slave_fd) skynet.error("Shakehand ready") skynet.fork(ready) end) diff --git a/service/debug_console.lua b/service/debug_console.lua index 09ce8933..ea637911 100644 --- a/service/debug_console.lua +++ b/service/debug_console.lua @@ -118,7 +118,7 @@ local function console_main_loop(stdin, print, addr) end skynet.start(function() - local listen_socket = socket.listen (ip, port) + local listen_socket, ip, port = socket.listen (ip, port) skynet.error("Start debug console at " .. ip .. ":" .. port) socket.start(listen_socket , function(id, addr) local function print(...) diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index f726593b..9974f32f 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -1089,7 +1089,28 @@ listen_socket(struct socket_server *ss, struct request_listen * request, struct goto _failed; } ATOM_STORE(&s->type , SOCKET_TYPE_PLISTEN); - return -1; + result->opaque = request->opaque; + result->id = id; + result->ud = 0; + result->data = "listen"; + + union sockaddr_all u; + socklen_t slen = sizeof(u); + if (getsockname(listen_fd, &u.s, &slen) == 0) { + void * sin_addr = (u.s.sa_family == AF_INET) ? (void*)&u.v4.sin_addr : (void *)&u.v6.sin6_addr; + if (inet_ntop(u.s.sa_family, sin_addr, ss->buffer, sizeof(ss->buffer)) == 0) { + result->data = strerror(errno); + return SOCKET_ERR; + } + int sin_port = ntohs((u.s.sa_family == AF_INET) ? u.v4.sin_port : u.v6.sin6_port); + result->data = ss->buffer; + result->ud = sin_port; + } else { + result->data = strerror(errno); + return SOCKET_ERR; + } + + return SOCKET_OPEN; _failed: close(listen_fd); result->opaque = request->opaque;