in platform/posix/transport/src/sockets_posix.c [305:409]
SocketStatus_t Sockets_Connect( int32_t * pTcpSocket,
const ServerInfo_t * pServerInfo,
uint32_t sendTimeoutMs,
uint32_t recvTimeoutMs )
{
SocketStatus_t returnStatus = SOCKETS_SUCCESS;
struct addrinfo * pListHead = NULL;
struct timeval transportTimeout;
int32_t setTimeoutStatus = -1;
if( pServerInfo == NULL )
{
LogError( ( "Parameter check failed: pServerInfo is NULL." ) );
returnStatus = SOCKETS_INVALID_PARAMETER;
}
else if( pServerInfo->pHostName == NULL )
{
LogError( ( "Parameter check failed: pServerInfo->pHostName is NULL." ) );
returnStatus = SOCKETS_INVALID_PARAMETER;
}
else if( pTcpSocket == NULL )
{
LogError( ( "Parameter check failed: pTcpSocket is NULL." ) );
returnStatus = SOCKETS_INVALID_PARAMETER;
}
else if( pServerInfo->hostNameLength == 0UL )
{
LogError( ( "Parameter check failed: hostNameLength must be greater than 0." ) );
returnStatus = SOCKETS_INVALID_PARAMETER;
}
else
{
/* Empty else. */
}
if( returnStatus == SOCKETS_SUCCESS )
{
returnStatus = resolveHostName( pServerInfo->pHostName,
pServerInfo->hostNameLength,
&pListHead );
}
if( returnStatus == SOCKETS_SUCCESS )
{
returnStatus = attemptConnection( pListHead,
pServerInfo->pHostName,
pServerInfo->hostNameLength,
pServerInfo->port,
pTcpSocket );
}
/* Set the send timeout. */
if( returnStatus == SOCKETS_SUCCESS )
{
transportTimeout.tv_sec = ( ( ( int64_t ) sendTimeoutMs ) / ONE_SEC_TO_MS );
transportTimeout.tv_usec = ( ONE_MS_TO_US * ( ( ( int64_t ) sendTimeoutMs ) % ONE_SEC_TO_MS ) );
setTimeoutStatus = setsockopt( *pTcpSocket,
SOL_SOCKET,
SO_SNDTIMEO,
&transportTimeout,
( socklen_t ) sizeof( transportTimeout ) );
if( setTimeoutStatus < 0 )
{
if( errno == ENOPROTOOPT )
{
LogInfo( ( "Setting socket send timeout skipped." ) );
}
else
{
LogError( ( "Setting socket send timeout failed." ) );
returnStatus = retrieveError( errno );
}
}
}
/* Set the receive timeout. */
if( returnStatus == SOCKETS_SUCCESS )
{
transportTimeout.tv_sec = ( ( ( int64_t ) recvTimeoutMs ) / ONE_SEC_TO_MS );
transportTimeout.tv_usec = ( ONE_MS_TO_US * ( ( ( int64_t ) recvTimeoutMs ) % ONE_SEC_TO_MS ) );
setTimeoutStatus = setsockopt( *pTcpSocket,
SOL_SOCKET,
SO_RCVTIMEO,
&transportTimeout,
( socklen_t ) sizeof( transportTimeout ) );
if( setTimeoutStatus < 0 )
{
if( errno == ENOPROTOOPT )
{
LogInfo( ( "Setting socket receive timeout skipped." ) );
}
else
{
LogError( ( "Setting socket receive timeout failed." ) );
returnStatus = retrieveError( errno );
}
}
}
return returnStatus;
}