bool Session::connect()

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;
}