//private
void Socks5UDPAssociateState::handleIP()
{
    //Evaluate the IP/port combo --- are we allowed to relay for it?
    bool allowedToRelay = true;

    if (!allowedToRelay)
    {
        QSharedPointer<Socks5ReplyMessage> msg(new Socks5ReplyMessage(Socks5ReplyMessage::DisallowedByRules,
                                                                      QHostAddress::Any,
                                                                      0));
        QString sendError;
        if (!_parent->sendMessage(msg,&sendError))
            qWarning() << this << "failed to notify client of access denied. Error:" << sendError;
        _parent->close();
        return;
    }

    //If we're allowed, just go ahead and try to set it up!
    QUdpSocket::BindMode bindMode = QUdpSocket::DefaultForPlatform;
    QUdpSocket * clientFacingSocket = new QUdpSocket(this);
    QUdpSocket * remoteFacingSocket = new QUdpSocket(this);
    if (!clientFacingSocket->bind(QHostAddress::Any,0,bindMode) ||
            !remoteFacingSocket->bind(QHostAddress::Any,0,bindMode))
    {
        qWarning() << "Failed to bind UDP socket";

        QSharedPointer<Socks5ReplyMessage> msg(new Socks5ReplyMessage(Socks5ReplyMessage::GeneralError,
                                                                     QHostAddress::Any,
                                                                     0));
        QString sendError;
        if (!_parent->sendMessage(msg,&sendError))
            qWarning() << this << "failed to notify client of failed UDP bind";

        _parent->close();
        return;
    }

    //Send a success reply to the client with the ip/port of the client-facing UDP sock
    QSharedPointer<Socks5ReplyMessage> msg(new Socks5ReplyMessage(Socks5ReplyMessage::Success,
                                                                  _parent->myBoundAddress(),
                                                                  clientFacingSocket->localPort()));
    qDebug() << _parent->myBoundAddress();
    QString sendError;
    if (!_parent->sendMessage(msg,&sendError))
    {
        qWarning() << "Failed to send successful UDP bind reply. Error:" << sendError;
        _parent->close();
        return;
    }
    QByteArray bytes;
    msg->toBytes(&bytes);

    //Transition to Socks5UDPAssociatedState
    Socks5UDPAssociatedState * nState = new Socks5UDPAssociatedState(clientFacingSocket,
                                                                     remoteFacingSocket,
                                                                     _parent);
    clientFacingSocket->setParent(nState);
    remoteFacingSocket->setParent(nState);
    _parent->setState(nState);
    return;
}