in linux/src/socket_transport_linux.c [80:136]
static SOCKET_HANDLE connect_to_client(const char* hostname, uint16_t port, uint32_t connection_timeout)
{
// Codes_SOCKET_TRANSPORT_LINUX_11_015: [ socket_transport_connect shall call socket with the params AF_INET, SOCK_STREAM and 0. ]
SOCKET_HANDLE client_socket = socket(AF_INET, SOCK_STREAM, 0);
if (client_socket == INVALID_SOCKET)
{
LogErrorNo("Failure: socket create failure.");
}
else
{
char port_string[16];
if (sprintf(port_string, "%u", port) < 0)
{
LogError("failed to copy port value %" PRIu16 "", port);
}
else
{
struct addrinfo addr_hint = { 0 };
struct addrinfo* addrInfo = NULL;
addr_hint.ai_family = AF_INET;
addr_hint.ai_socktype = SOCK_STREAM;
addr_hint.ai_protocol = 0;
addr_hint.ai_flags = AI_CANONNAME;
if (getaddrinfo(hostname, port_string, &addr_hint, &addrInfo) != 0)
{
LogErrorNo("Failure: getaddrinfo(hostname=%s, portString=%s, &addr_hint=%p, &addrInfo=%p)", hostname, port_string, &addr_hint, &addrInfo);
}
else
{
LogInfo("Connecting to %s:%" PRIu16 " Machine Name: %s, connection timeout: %" PRIu32 "", hostname, port, MU_P_OR_NULL(addrInfo->ai_canonname), connection_timeout);
// Codes_SOCKET_TRANSPORT_LINUX_11_016: [ socket_transport_connect shall call connect to connect to the endpoint. ]
if (connect(client_socket, addrInfo->ai_addr, addrInfo->ai_addrlen) != 0)
{
LogErrorNo("Connection failure. Server: %s:%" PRIu16 ".", hostname, port);
}
// Codes_SOCKET_TRANSPORT_LINUX_11_017: [ socket_transport_connect shall set the socket to non-blocking by calling fcntl with O_NONBLOCK. ]
else if (set_nonblocking(client_socket) != 0)
{
LogError("Failure: nonblocking failure.");
}
else
{
freeaddrinfo(addrInfo);
goto all_ok;
}
freeaddrinfo(addrInfo);
}
}
close(client_socket);
client_socket = INVALID_SOCKET;
}
all_ok:
return client_socket;
}