Qudpsocket 多播根权限



我已经使用 QUdpSocket 编写了一个简单的 udp 组播服务器,但 writedatagram 函数仅在我以 root 权限运行应用程序时才有效。这正常吗?这是一种痛苦。另外,iperf(例如)似乎可以在没有root权限的情况下工作。我做错了什么?

平台是 Ubuntu 12.04 3.2.0-56-通用x86_64我的代码非常简单...

#define MULTICAST_ADDR "192.168.1.255"
#define MULTICAST_PORT 45454
udpSocket = new QUdpSocket();
udpSocket->setSocketOption(QAbstractSocket::MulticastTtlOption,1);
udpSocket->setSocketOption(QAbstractSocket::MulticastLoopbackOption,0);
    x = udpSocket->writeDatagram(ba->data()+sent,
                                toSend,
                                QHostAddress(MULTICAST_ADDR),
                                MULTICAST_PORT);

此代码基于 QT 自己的示例代码,其中没有提及根权限。

如果我只是将 IP 地址更改为非广播/组播地址(例如 192.168.1.18),则不需要 root 权限。

不完全是答案。但几乎。我知道与TCP相比,UDP有点残酷,并且必须由应用程序管理限制,以便很好地处理带宽和资源。我发现在每次writeDatagram调用后暂停可以解决问题。某处有什么东西堵塞了?但是为什么使用 root 权限运行可以规避这个问题呢?也许系统以root权限运行得更快,因此我能够完全调用writeDatagram而不会遭受错误编码的后果?

另请注意,我不再在恶性循环中调用 writeDatagram,而是调用每个后续的 writeDatagram 来响应 bytesWrite 信号。我不认为这是为了解决我的错误,但它看起来更像是正确的编码。

最新更新