Don't perform the connection test in resolveHostName() for single addresses unless required

This commit is contained in:
Cameron Gutman
2020-09-06 17:11:14 -07:00
parent 6ca0b93809
commit 128c1503f2
3 changed files with 10 additions and 5 deletions
+1 -1
View File
@@ -102,7 +102,7 @@ unsigned int LiTestClientConnectivity(const char* testServer, unsigned short ref
return ML_TEST_RESULT_INCONCLUSIVE; return ML_TEST_RESULT_INCONCLUSIVE;
} }
err = resolveHostName(testServer, AF_UNSPEC, referencePort, &address, &address_length); err = resolveHostName(testServer, AF_UNSPEC, TCP_PORT_FLAG_ALWAYS_TEST | referencePort, &address, &address_length);
if (err != 0) { if (err != 0) {
return ML_TEST_RESULT_INCONCLUSIVE; return ML_TEST_RESULT_INCONCLUSIVE;
} }
+5 -3
View File
@@ -446,11 +446,13 @@ int resolveHostName(const char* host, int family, int tcpTestPort, struct sockad
} }
for (currentAddr = res; currentAddr != NULL; currentAddr = currentAddr->ai_next) { for (currentAddr = res; currentAddr != NULL; currentAddr = currentAddr->ai_next) {
// Use the test port to ensure this address is working // Use the test port to ensure this address is working if:
if (tcpTestPort != 0) { // a) We have multiple addresses
// b) The caller asked us to test even with a single address
if (tcpTestPort != 0 && (res->ai_next != NULL || (tcpTestPort & TCP_PORT_FLAG_ALWAYS_TEST))) {
SOCKET testSocket = connectTcpSocket((struct sockaddr_storage*)currentAddr->ai_addr, SOCKET testSocket = connectTcpSocket((struct sockaddr_storage*)currentAddr->ai_addr,
currentAddr->ai_addrlen, currentAddr->ai_addrlen,
tcpTestPort, tcpTestPort & TCP_PORT_MASK,
TEST_PORT_TIMEOUT_SEC); TEST_PORT_TIMEOUT_SEC);
if (testSocket == INVALID_SOCKET) { if (testSocket == INVALID_SOCKET) {
// Try the next address // Try the next address
+4 -1
View File
@@ -52,7 +52,6 @@ typedef socklen_t SOCKADDR_LEN;
void addrToUrlSafeString(struct sockaddr_storage* addr, char* string); void addrToUrlSafeString(struct sockaddr_storage* addr, char* string);
SOCKET createSocket(int addressFamily, int socketType, int protocol, int nonBlocking); SOCKET createSocket(int addressFamily, int socketType, int protocol, int nonBlocking);
int resolveHostName(const char* host, int family, int tcpTestPort, struct sockaddr_storage* addr, SOCKADDR_LEN* addrLen);
SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec); SOCKET connectTcpSocket(struct sockaddr_storage* dstaddr, SOCKADDR_LEN addrlen, unsigned short port, int timeoutSec);
int sendMtuSafe(SOCKET s, char* buffer, int size); int sendMtuSafe(SOCKET s, char* buffer, int size);
SOCKET bindUdpSocket(int addrfamily, int bufferSize); SOCKET bindUdpSocket(int addrfamily, int bufferSize);
@@ -66,6 +65,10 @@ void closeSocket(SOCKET s);
int isPrivateNetworkAddress(struct sockaddr_storage* address); int isPrivateNetworkAddress(struct sockaddr_storage* address);
int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs); int pollSockets(struct pollfd* pollFds, int pollFdsCount, int timeoutMs);
#define TCP_PORT_MASK 0xFFFF
#define TCP_PORT_FLAG_ALWAYS_TEST 0x10000
int resolveHostName(const char* host, int family, int tcpTestPort, struct sockaddr_storage* addr, SOCKADDR_LEN* addrLen);
void enterLowLatencyMode(void); void enterLowLatencyMode(void);
void exitLowLatencyMode(void); void exitLowLatencyMode(void);