diff --git a/doc/tcp.html b/doc/tcp.html index fb627a1..c86853d 100644 --- a/doc/tcp.html +++ b/doc/tcp.html @@ -242,11 +242,14 @@ established.

Note: Starting with LuaSocket 3.0, the host name resolution -depends on whether the socket was created by socket.tcp or socket.tcp6. Addresses from -the appropriate family are tried in succession until the -first success or until the last failure. +depends on whether the socket was created by +socket.tcp, +socket.tcp4 or +socket.tcp6. Addresses from +the appropriate family (or both) are tried in the order +returned by the resolver until the +first success or until the last failure. If the timeout was +set to zero, only the first address is tried.

diff --git a/src/inet.c b/src/inet.c index 331b800..f4c8404 100644 --- a/src/inet.c +++ b/src/inet.c @@ -423,8 +423,8 @@ const char *inet_tryconnect(p_socket ps, int *family, const char *address, /* try connecting to remote address */ err = socket_strerror(socket_connect(ps, (SA *) iterator->ai_addr, (socklen_t) iterator->ai_addrlen, tm)); - /* if success, break out of loop */ - if (err == NULL) { + /* if success or timeout is zero, break out of loop */ + if (err == NULL || timeout_iszero(tm)) { *family = current_family; break; } diff --git a/src/tcp.c b/src/tcp.c index cef9d16..e4f1a4b 100644 --- a/src/tcp.c +++ b/src/tcp.c @@ -417,7 +417,7 @@ static int global_connect(lua_State *L) { bindhints.ai_family = family; bindhints.ai_flags = AI_PASSIVE; if (localaddr) { - err = inet_trybind(&tcp->sock, &tcp->family, localaddr, + err = inet_trybind(&tcp->sock, &tcp->family, localaddr, localserv, &bindhints); if (err) { lua_pushnil(L); @@ -429,7 +429,7 @@ static int global_connect(lua_State *L) { memset(&connecthints, 0, sizeof(connecthints)); connecthints.ai_socktype = SOCK_STREAM; /* make sure we try to connect only to the same family */ - connecthints.ai_family = tcp->family; + connecthints.ai_family = tcp->family; err = inet_tryconnect(&tcp->sock, &tcp->family, remoteaddr, remoteserv, &tcp->tm, &connecthints); if (err) {