0

我已经使用 QUdpSocket 编写了一个简单的 udp 多播服务器,但 writedatagram 函数只有在我以 root 权限运行应用程序时才有效。这是正常的吗?这是一种痛苦。加上 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 权限。

4

1 回答 1

0

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

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

于 2013-11-10T14:56:32.020 回答