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