diff --git a/src/socket.lua b/src/socket.lua index a9219b0..9035443 100644 --- a/src/socket.lua +++ b/src/socket.lua @@ -19,20 +19,30 @@ function connect(address, port, laddress, lport) if address == "*" then address = "0.0.0.0" end local addrinfo, err = socket.dns.getaddrinfo(address); if not addrinfo then return nil, err end - local sock, err; - if addrinfo[1].family == "inet" then - sock, err = socket.tcp() - else - sock, err = socket.tcp6() + local err = "no info on address" + local sock, res + for i, alt in base.ipairs(addrinfo) do + if alt.family == "inet" then + sock, err = socket.tcp() + else + sock, err = socket.tcp6() + end + if not sock then return nil, err end + if laddress then + res, err = sock:bind(laddress, lport) + if not res then + sock:close() + return nil, err + end + end + res, err = sock:connect(alt.addr, port) + if not res then + sock:close() + else + return sock + end end - if not sock then return nil, err end - if laddress then - local res, err = sock:bind(laddress, lport, -1) - if not res then return nil, err end - end - local res, err = sock:connect(address, port) - if not res then return nil, err end - return sock + return nil, err end function bind(host, port, backlog)