2009-09-08 5 views
2

Essentiellement, j'essaie de créer une application proxy DNS en utilisant Qt4. Si je définis mon serveur de noms DNS sur 'localhost', je veux transférer toutes les requêtes DNS au serveur spécifié dans l'objet remoteSocket. Tout semble fonctionner correctement, sauf renvoyer les données de l'objet remoteSocket à l'objet localSocket qui demande la recherche DNS. Lorsque vous écrivez à localSocket, y a-t-il quelque chose de spécifique que je dois savoir à ce sujet? Le problème semble être dans readResponse().Qt4 DNS Proxy QUdpSocket

#include "dns.h" 

Dns::Dns() 
{ 
} 

void Dns::initSocket() 
{ 
    localDatagram = new QByteArray(); 
    remoteDatagram = new QByteArray(); 

    localSocket = new QUdpSocket(); 
    connect(localSocket, SIGNAL(readyRead()), this, SLOT(readRequest()), Qt::DirectConnection); 
    localSocket->bind(QHostAddress::LocalHost, 53); 

    remoteSocket = new QUdpSocket(); 
    remoteSocket->connectToHost(QHostAddress("4.2.2.1"), 53); 
    connect(remoteSocket, SIGNAL(readyRead()), this, SLOT(readResponse()), Qt::DirectConnection); 

} 

void Dns::readRequest() 
{ 
    while (localSocket->hasPendingDatagrams()) { 
     localDatagram->resize(localSocket->pendingDatagramSize());\ 
     localSocket->readDatagram(localDatagram->data(), localDatagram->size()); 
     remoteSocket->write(*localDatagram); 
    } 
} 

void Dns::readResponse() 
{ 
    QByteArray bytes(remoteSocket->readAll()); 
    qDebug() << "BYTES: [" << bytes.toBase64() << "]"; 
    localSocket->write(bytes); 
} 
+0

Toute aide à ce serait grandement apprécié. – Michael

+0

Vous ne nous avez pas dit * comment * il est cassé, seulement qu'il est cassé. Qu'est-ce qui te fait penser que c'est cassé? Quel résultat obtenez-vous de votre ligne de débogage? Qu'avez-vous essayé de faire pour résoudre le problème? votre slot readResponse() est-il même appelé? S'il vous plaît ajouter plus d'infos et je vais essayer de vous aider. – Thomi

Répondre

1

Je suis en supposant que l'utilisation de QUdpSocket :: bind(), l'objet socket résultant serait en mesure d'obtenir le peerAddress/PeerPort en utilisant les méthodes d'accès, mais qui n'a pas été le cas.

La solution finale était de faire:

QHostAddress sender; 
quint16 senderPort; 

localSocket->readDatagram(localDatagram->data(), localDatagram->size(), &sender, &senderPort); 

Et readResponse(),

localSocket->writeDatagram(bytes, sender, senderPort); 
+0

Oui, UDP est un protocole sans connexion, donc la seule fois que l'information est disponible, c'est quand un paquet arrive. – Thomi