diff options
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() |