diff options
author | Diego Nehab <diego.nehab@gmail.com> | 2012-04-23 01:40:31 +0800 |
---|---|---|
committer | Diego Nehab <diego.nehab@gmail.com> | 2012-04-23 01:40:31 +0800 |
commit | 1acf8188cd732de4fd5fcdc016eeab501c86a773 (patch) | |
tree | 5d773638ae76b0d4d09c32b6f8a2dddc59449f25 /src/socket.lua | |
parent | 966642f76abeea579ddcf8da8651244fcf5cbd5a (diff) | |
download | luasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.tar.gz luasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.tar.bz2 luasocket-1acf8188cd732de4fd5fcdc016eeab501c86a773.zip |
socket.bind also tries all addresses returned by getaddrinfo.
Diffstat (limited to 'src/socket.lua')
-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 9035443..8c5f231 100644 --- a/src/socket.lua +++ b/src/socket.lua | |||
@@ -19,8 +19,8 @@ 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 err = "no info on address" | ||
23 | local sock, res | 22 | local sock, res |
23 | err = "no info on address" | ||
24 | for i, alt in base.ipairs(addrinfo) do | 24 | for i, alt in base.ipairs(addrinfo) do |
25 | if alt.family == "inet" then | 25 | if alt.family == "inet" then |
26 | sock, err = socket.tcp() | 26 | sock, err = socket.tcp() |
@@ -49,19 +49,29 @@ function bind(host, port, backlog) | |||
49 | if host == "*" then host = "0.0.0.0" end | 49 | if host == "*" then host = "0.0.0.0" end |
50 | local addrinfo, err = socket.dns.getaddrinfo(host); | 50 | local addrinfo, err = socket.dns.getaddrinfo(host); |
51 | if not addrinfo then return nil, err end | 51 | if not addrinfo then return nil, err end |
52 | local sock, err; | 52 | local sock, res |
53 | if addrinfo[1].family == "inet" then | 53 | err = "no info on address" |
54 | sock, err = socket.tcp() | 54 | for i, alt in base.ipairs(addrinfo) do |
55 | else | 55 | if alt.family == "inet" then |
56 | sock, err = socket.tcp6() | 56 | sock, err = socket.tcp() |
57 | else | ||
58 | sock, err = socket.tcp6() | ||
59 | end | ||
60 | if not sock then return nil, err end | ||
61 | sock:setoption("reuseaddr", true) | ||
62 | res, err = sock:bind(alt.addr, port) | ||
63 | if not res then | ||
64 | sock:close() | ||
65 | else | ||
66 | res, err = sock:listen(backlog) | ||
67 | if not res then | ||
68 | sock:close() | ||
69 | else | ||
70 | return sock | ||
71 | end | ||
72 | end | ||
57 | end | 73 | end |
58 | if not sock then return nil, err end | 74 | return nil, err |
59 | sock:setoption("reuseaddr", true) | ||
60 | local res, err = sock:bind(host, port) | ||
61 | if not res then return nil, err end | ||
62 | res, err = sock:listen(backlog) | ||
63 | if not res then return nil, err end | ||
64 | return sock | ||
65 | end | 75 | end |
66 | 76 | ||
67 | try = newtry() | 77 | try = newtry() |