【问题标题】:qudpsocket multicast root privilegesqudpsocket 多播 root 权限
【发布时间】:2013-11-10 13:47:08
【问题描述】:

我已经使用 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 权限。

【问题讨论】:

    标签: root multicast elevated-privileges qudpsocket


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-11-09
      • 2011-03-22
      • 2011-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2016-05-04
      • 2020-01-11
      相关资源
      最近更新 更多