使用 QUdpSocket 的 Qt4 DNS 服务器

Posted

技术标签:

【中文标题】使用 QUdpSocket 的 Qt4 DNS 服务器【英文标题】:Qt4 DNS Server using QUdpSocket 【发布时间】:2009-09-09 04:54:38 【问题描述】:

我正在为我正在开发的应用程序编写 DNS 服务器,但遇到了一些困难。

我想绑定到 localhost 的 53 端口并监听 DNS 查询请求,然后发回响应。不幸的是,当我调用 QUdpSocket::bind() 时,生成的套接字是不可写的。是否需要传递一个标志才能发送数据?

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

稍后,在建立连接后,我想调用其中一个 QUdpSocket::write* 方法,但这不起作用,因为 writeable 是 false..

【问题讨论】:

【参考方案1】:

首先,您确定要绑定到QHostAddress::Lockhost 吗?您意识到这在任何公共网络上都不可见,对吗?它只会对同一个物理盒子上的应用程序可见..

其次,您没有检查 QUdpSocket::bind 调用的返回参数,因此您无法知道绑定调用是否实际成功。

第三,你试过没有QUdpSocket::ShareAddress 提示吗? Qt documentation for BindMode enum 隐晦地声明了 ShareAddress

但是,因为任何服务都是 允许重新绑定,这个选项是 受一定安全约束 考虑。

我不确定这些安全注意事项是什么 - 但首先要尝试的事情之一就是简化您的代码。

最后,问题可能出在onReadyRead() 插槽中的代码?发布该代码可能有助于我们诊断问题。

【讨论】:

是的,我确信在这种情况下会绑定到 LocalHost。我粘贴的代码是重现问题案例的最短代码量,因此没有包括错误检查。我将在未来包含这些信息。我能够使用我之前在 ***.com/questions/1392494/qt4-dns-proxy-qudpsocket***.com/questions/1392494/qt4-dns-proxy-qudpsocket 提出的另一个问题中使用的相同方法解决我的问题【参考方案2】:

您在哪个平台上运行?

我认为Linux出于安全原因不允许普通用户绑定低于1024。

【讨论】:

以上是关于使用 QUdpSocket 的 Qt4 DNS 服务器的主要内容,如果未能解决你的问题,请参考以下文章

深信服防火墙里设置dns

QUdpSocket 简单用法

QUdpSocket 高速率消息读取

QT QUdpSocket:没有这样的文件或目录

QT下UDP套接字通信——QUdpSocket 简单使用

QUdpSocket-Qt使用Udp通讯实现服务端和客户端