我使用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权限。
答案 0 :(得分:0)
不完全是答案......但差不多。我知道UDP与TCP相比有点残酷,并且必须由应用程序管理限制,以便很好地处理带宽和资源。我发现在每次writeDatagram调用后暂停都会解决问题。什么东西被堵塞了?但是为什么以root权限运行会绕过这个问题呢?也许系统以root权限运行得更快,所以我能够在不遭受编码错误后果的情况下调用writeDatagram吗?
另请注意,我不再在恶性循环中调用writeDatagram,而是调用每个后续writeDatagram以响应bytesWritten信号。我认为这不会影响我的错误,但它看起来更像是正确的编码。