使用 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 服务器的主要内容,如果未能解决你的问题,请参考以下文章