2009-09-08 74 views
2

我基本上試圖做一個使用Qt4的DNS代理應用程序。如果我將我的DNS名稱服務器設置爲'localhost',那麼我想將所有DNS請求轉發到remoteSocket對象中指定的服務器。除了將數據從remoteSocket對象發送回請求DNS查找的localSocket對象之外,似乎一切正常。Qt4 DNS代理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 2009-09-09 03:18:28

+0

你還沒有告訴我們*它是如何被破壞的,只是它被破壞了。是什麼讓你覺得它壞了?你從調試線獲得什麼輸出?你有什麼試圖解決這個問題?你的readResponse()槽甚至會被調用嗎? 請添加更多信息,我會盡力而且幫助。 – Thomi 2009-09-09 11:40:22

回答

1

我是假設,使用QUdpSocket提供::綁定(),所得到的插座對象將能夠使用該訪問方法以獲得peerAddress/peerPort,但是事實並非如此。

最終的解決辦法是要做到:

QHostAddress sender; 
quint16 senderPort; 

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

而且在readResponse(),

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

是的,UDP是無連接協議,所以信息可用的唯一時間是數據包到達時。 – Thomi 2009-09-10 07:14:33