in platform/posix/transport/src/sockets_posix.c [219:279]
static SocketStatus_t attemptConnection( struct addrinfo * pListHead,
const char * pHostName,
size_t hostNameLength,
uint16_t port,
int32_t * pTcpSocket )
{
SocketStatus_t returnStatus = SOCKETS_CONNECT_FAILURE;
const struct addrinfo * pIndex = NULL;
assert( pListHead != NULL );
assert( pHostName != NULL );
assert( hostNameLength > 0 );
assert( pTcpSocket != NULL );
/* Unused parameters when logging is disabled. */
( void ) pHostName;
( void ) hostNameLength;
LogDebug( ( "Attempting to connect to: Host=%.*s.",
( int32_t ) hostNameLength,
pHostName ) );
/* Attempt to connect to one of the retrieved DNS records. */
for( pIndex = pListHead; pIndex != NULL; pIndex = pIndex->ai_next )
{
*pTcpSocket = socket( pIndex->ai_family,
pIndex->ai_socktype,
pIndex->ai_protocol );
if( *pTcpSocket == -1 )
{
continue;
}
/* Attempt to connect to a resolved DNS address of the host. */
returnStatus = connectToAddress( pIndex->ai_addr, port, *pTcpSocket );
/* If connected to an IP address successfully, exit from the loop. */
if( returnStatus == SOCKETS_SUCCESS )
{
break;
}
}
if( returnStatus == SOCKETS_SUCCESS )
{
LogDebug( ( "Established TCP connection: Server=%.*s.\n",
( int32_t ) hostNameLength,
pHostName ) );
}
else
{
LogError( ( "Could not connect to any resolved IP address from %.*s.",
( int32_t ) hostNameLength,
pHostName ) );
}
freeaddrinfo( pListHead );
return returnStatus;
}