2009-09-08 3 views
2

Я пытаюсь сделать прокси-приложение DNS с помощью Qt4. Если я настрою свой DNS-сервер имен на «localhost», тогда я хочу перенаправить все DNS-запросы на сервер, указанный в объекте remoteSocket. Кажется, что все работает нормально, за исключением отправки данных из объекта remoteSocket обратно в объект localSocket, который запрашивает поиск DNS.Qt4 DNS Proxy QUdpSocket

При написании на localSocket есть ли что-то конкретное, что мне нужно знать об этом? Проблема, похоже, в readResponse().

#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

Любая помощь с этим было бы весьма признателен. – Michael

+0

Вы не сказали нам, как это сломано, только то, что оно сломано. Что заставляет вас думать, что это сломано? Какой результат вы получаете от своей линии отладки? Что вы пытались сделать, чтобы исправить проблему? ваш звонок readResponse() даже вызван? Пожалуйста, добавьте дополнительную информацию, и я попробую и помогу. – Thomi

ответ

1

я предполагая, что использование QUdpSocket :: Bind(), результирующий объект сокет будет иметь возможность получить peerAddress/PeerPort с использованием методов доступа, однако, что это не так.

Окончательное решение должно было сделать:

QHostAddress sender; 
quint16 senderPort; 

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

И в readResponse(),

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

Да, UDP - это протокол без установления соединения, поэтому единственный доступ к этой информации - когда приходит пакет. – Thomi

Смежные вопросы