diff options
author | Diego Nehab <diego.nehab@gmail.com> | 2012-04-23 01:29:41 +0800 |
---|---|---|
committer | Diego Nehab <diego.nehab@gmail.com> | 2012-04-23 01:29:41 +0800 |
commit | 966642f76abeea579ddcf8da8651244fcf5cbd5a (patch) | |
tree | 03411cecb6c385dc45f34ce6e2bbd41f557676a0 | |
parent | f960b3872a668ed1b53bd50c5b6a708367332f3c (diff) | |
download | luasocket-966642f76abeea579ddcf8da8651244fcf5cbd5a.tar.gz luasocket-966642f76abeea579ddcf8da8651244fcf5cbd5a.tar.bz2 luasocket-966642f76abeea579ddcf8da8651244fcf5cbd5a.zip |
socket.connect() loops over addresses returned by getaddrinfo
-rw-r--r-- | src/socket.lua | 36 |
1 files changed, 23 insertions, 13 deletions
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) | |||
19 | if address == "*" then address = "0.0.0.0" end | 19 | if address == "*" then address = "0.0.0.0" end |
20 | local addrinfo, err = socket.dns.getaddrinfo(address); | 20 | local addrinfo, err = socket.dns.getaddrinfo(address); |
21 | if not addrinfo then return nil, err end | 21 | if not addrinfo then return nil, err end |
22 | local sock, err; | 22 | local err = "no info on address" |
23 | if addrinfo[1].family == "inet" then | 23 | local sock, res |
24 | sock, err = socket.tcp() | 24 | for i, alt in base.ipairs(addrinfo) do |
25 | else | 25 | if alt.family == "inet" then |
26 | sock, err = socket.tcp6() | 26 | sock, err = socket.tcp() |
27 | end | 27 | else |
28 | if not sock then return nil, err end | 28 | sock, err = socket.tcp6() |
29 | if laddress then | 29 | end |
30 | local res, err = sock:bind(laddress, lport, -1) | 30 | if not sock then return nil, err end |
31 | if not res then return nil, err end | 31 | if laddress then |
32 | res, err = sock:bind(laddress, lport) | ||
33 | if not res then | ||
34 | sock:close() | ||
35 | return nil, err | ||
36 | end | ||
37 | end | ||
38 | res, err = sock:connect(alt.addr, port) | ||
39 | if not res then | ||
40 | sock:close() | ||
41 | else | ||
42 | return sock | ||
43 | end | ||
32 | end | 44 | end |
33 | local res, err = sock:connect(address, port) | 45 | return nil, err |
34 | if not res then return nil, err end | ||
35 | return sock | ||
36 | end | 46 | end |
37 | 47 | ||
38 | function bind(host, port, backlog) | 48 | function bind(host, port, backlog) |