in src/tcp-proxy.cpp [503:565]
bool Session::connect()
{
// At this point we already have initialized clientSocket field
// Initialize clientsocket
sock[HOST] = socket_init_tcp();
sockaddr_set_ip4(&localAddress, INADDR_ANY, 0);
if (0 != bind(sock[HOST], (struct sockaddr *)&localAddress, sizeof(DX_SOCKET_ADDRESS))) {
err("bind(localhost): Socket error :%d", socket_last_error());
return false;
}
struct addrinfo * addr = NULL, * current_addr, hints;
char portName[32];
DX_CLEAR(hints);
// TODO: refactor
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
sprintf(portName, "%d", (int)remotePort);
// Resolve the server address and port
int result = getaddrinfo(remoteHostName.c_str(), portName, &hints, &addr);
if (0 != result) {
err("connect(): unable to resolve address '%s' error: %d", remoteHostName.c_str(), result);
return false;
}
result = -1;
for (current_addr = addr; current_addr != NULL; current_addr = current_addr->ai_next) {
result = ::connect(sock[HOST], current_addr->ai_addr, (int)current_addr->ai_addrlen);
if (0 != result)
continue;
break;
}
if (0 != result) {
err("connect(): unable to connect to '%s' error: %d", remoteHostName.c_str(), socket_last_error());
return false;
}
if (0 != socket_non_blocking_enable(sock[CLIENT], true)) {
err("connect(): unable to set non-blocking mode for incoming socket, error: ", socket_last_error());
return false;
}
if (0 != socket_non_blocking_enable(sock[HOST], true)) {
err("connect(): unable to set non-blocking mode for outgoing socket, error: ", socket_last_error());
return false;
}
isPreloadFinished = false;
DX_CLEAR(tData1stReceivedFrom);
DX_CLEAR(tDataLastReceivedFrom);
DX_CLEAR(tData1stSentFrom);
DX_CLEAR(tDataLastSentFrom);
tPreloadFinished = tStart;
tEnd = UINT64_MAX;
return true;
}