0

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);

このコードは、root 権限について言及していない QT 独自のサンプル コードに基づいています。

IP アドレスを非ブロードキャスト/マルチキャスト アドレス (例: 192.168.1.18) に変更するだけであれば、root 権限は必要ありません。

4

1 に答える 1

0

正確な答えではありません..しかし、ほとんど。UDP は TCP に比べて少し残忍であり、帯域幅とリソースが適切に処理されるように、スロットリングをアプリで管理する必要があることを私は知っています。writeDatagram 呼び出しのたびに一時停止すると、問題が解決することがわかりました。どこかが詰まっている?しかし、なぜ root 権限で実行するとこの問題を回避できるのでしょうか? おそらくシステムは root 権限でより高速に実行されるので、私の悪いコーディングの結果に苦しむことなく writeDatagram を完全に呼び出すことができますか?

また、悪質なループで writeDatagram を呼び出すのではなく、bytesWritten シグナルに応答して後続の各 writeDatagram を呼び出すことにも注意してください。これが私のエラーに関係しているとは思いませんが、適切なコーディングのように見えます。

于 2013-11-10T14:56:32.020 に答える