2013-11-10 3 views
0

Я написал простой многоадресный сервер udp с использованием QUdpSocket, но функция writedatagram работает только в том случае, если я запускаю приложение с привилегиями root. Это нормально? Это боль. Плюс iperf (например), похоже, работает без привилегий root. Что я делаю не так?qudpsocket многоадресные корневые привилегии

Платформа 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); 

Этот код основан на QTs собственный пример кода, который не имеет никакого упоминания корневых привилегий.

Если я просто изменяю IP-адрес на адрес широковещательной/многоадресной рассылки (например, 192.168.1.18), мне не нужны права root.

ответ

0

Не совсем ответ ... но почти. Я знаю, что UDP немного жесток по сравнению с TCP и что управление дросселем должно управляться приложением, так что пропускная способность и ресурсы обрабатываются красиво. Я обнаружил, что пауза после каждого из вызовов writeDatagram исправила проблему. Что-то где-то забилось? Но почему запуск с привилегиями root обойти эту проблему? Возможно, система работает быстрее с привилегиями root, поэтому я могу называть writeDatagram плоским, не испытывая последствий моего плохого кодирования?

Обратите также внимание на то, что я больше не вызываю writeDatagram в порочном цикле, но вместо этого вызываю каждую последующую запись в ответ на сигнал bytesWritten. Я не думаю, что это связано с моей ошибкой, но это больше похоже на правильное кодирование.