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