qudpsocket组播root权限

时间:2013-11-10 13:47:09

标签: root multicast elevated-privileges qudpsocket

我使用QUdpSocket编写了一个简单的udp组播服务器,但只有当我以root权限运行应用程序时,writedatagram函数才有效。这是正常的吗?这是一种痛苦。加上iperf(例如)似乎没有root权限。我做错了什么?

平台是Ubuntu 12.04 3.2.0-56-generic 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自己的示例代码,但未提及root权限。

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

1 个答案:

答案 0 :(得分:0)

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

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