diff --git a/lualib/skynet/dns.lua b/lualib/skynet/dns.lua index 31c49eaa..96470e12 100644 --- a/lualib/skynet/dns.lua +++ b/lualib/skynet/dns.lua @@ -286,17 +286,29 @@ local function resolve(content) skynet.wakeup(resp.co) end +local function connect_server() + local fd = socket.udp(function(str, from) + resolve(str) + end) + socket.udp_connect(fd, dns_server.address, dns_server.port) + + if dns_server.fd then + socket.close(fd) + else + dns_server.fd = fd + skynet.error(string.format("Udp server open %s:%s (%d)", dns_server.address, dns_server.port, fd)) + end +end + local DNS_SERVER_RETIRE = 60 * 100 local function touch_server() dns_server.retire = skynet.now() if dns_server.fd then return end - dns_server.fd = socket.udp(function(str, from) - resolve(str) - end) - skynet.error(string.format("Udp server open %s:%s (%d)", dns_server.address, dns_server.port, dns_server.fd)) - socket.udp_connect(dns_server.fd, dns_server.address, dns_server.port) + + connect_server() + local function check_alive() if skynet.now() > dns_server.retire + DNS_SERVER_RETIRE then local fd = dns_server.fd diff --git a/skynet-src/socket_server.c b/skynet-src/socket_server.c index 5ca04f0e..79158c5a 100644 --- a/skynet-src/socket_server.c +++ b/skynet-src/socket_server.c @@ -1542,7 +1542,7 @@ socket_server_send(struct socket_server *ss, int id, const void * buffer, int sz union sockaddr_all sa; socklen_t sasz = udp_socket_address(s, s->p.udp_address, &sa); if (sasz == 0) { - fprintf(stderr, "socket-server : udp (%d) type mismatch.\n", id); + fprintf(stderr, "socket-server : set udp (%d) address first.\n", id); socket_unlock(&l); so.free_func((void *)buffer); return -1;