【问题标题】:UDP broadcasting with QT使用 QT 进行 UDP 广播
【发布时间】:2016-07-30 17:18:24
【问题描述】:

我两天以来一直在寻找如何发送 UDP 广播。我看过很多例子(还有 qt 网站上的 broadcastReceiver 和 broadcastSender ),但它们仍然不适合我。当我尝试发送广播时,方法 QUdpSocket::writeDatagram(..) 返回 -1 并且不传输数据。我在 ubuntu 14.04 x64 上。我想知道我是否应该做一些特殊的操作来使这个广播工作。感谢和抱歉我的英语水平。

这是我的代码

 envoyeurUDP=new QUdpSocket(this);
recepteurUDP=new QUdpSocket(this);
//démarrage du serveur pour UDP
if (!recepteurUDP->bind(QHostAddress::AnyIPv4,7878,QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint)) {
  qDebug("Impossible de créer la socket en écoute");
 exit(EXIT_FAILURE);
}

connect(recepteurUDP, SIGNAL(readyRead()), this, SLOT(lireDatagrams()));
void FileTransferManager::lireDatagrams(){

char* donnees;
while (recepteurUDP->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(recepteurUDP->pendingDatagramSize());
        recepteurUDP->readDatagram(datagram.data(), datagram.size());
        donnees=datagram.data();
    }}

和这个发送数据报

void FileTransferManager::sendDatagram(string msg, QHostAddress addr){
QByteArray datagram=msg.data();
    qint64 r=envoyeurUDP->writeDatagram(datagram.data(), datagram.size(),  addr, 7878);}

我是这样使用它的:

fileManager.sendDatagram("blabla",QHostAddress::Broadcast);

这是我的 ifconfig 命令的输出:

eth0 链路封装:以太网 HWaddr f8:a9:63:2d:89:ff
上行广播多播 MTU:1500 公制:1 数据包 reçus:0 erreurs:0 :0 overruns:0 frame:0 TX 数据包:0 错误:0 丢弃:0 超限:0 运营商:0 冲突:0 lg 文件传输:1000 Octets reçus:0 (0.0 B) Octets transmis:0 (0.0 B)

lo 链接封装:Boucle 语言环境
inet adr:127.0.0.1 面具:255.0.0.0 adrinet6:::1/128 范围:酒店 上环回运行 MTU:65536 指标:1 数据包 reçus:5311 erreurs:0 :0 overruns:0 frame:0 TX 数据包:5311 错误:0 丢弃:0 超限:0 运营商:0 冲突:0 lg 文件传输:0 Octets reçus:661728 (661.7 KB) Octets transmis:661728 (661.7 KB)

wlan0 链路封装:以太网 HWaddr b8:ee:65:ab:4f:77
inet adr:10.42.0.1 Bcast:10.42.0.255 面具:255.255.255.0 adrinet6: fe80::baee:65ff:feab:4f77/64 范围:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 数据包 reçus:14069 erreurs:0 :0 overruns:0 frame:0 TX 数据包:15529 错误:0 丢弃:0 超限:0 运营商:0 冲突:0 lg 文件传输:1000 Octets reçus:6007592 (6.0 MB) Octets transmis:2307422 (2.3 MB)

【问题讨论】:

  • 需要一个简短的代码示例来演示问题。否则你可能不会在这里得到任何帮助。 ifconfig 的输出也会有帮助,以检查地址是否确实被广播。
  • 谢谢我已经编辑了我的帖子以便添加代码
  • 有趣。调用writeDatagram()失败后,数据报套接字上的error()errorString()返回什么?
  • errorString() 返回“无法发送消息”
  • error() 返回一个 SocketError 对象,我不知道如何打印它。怎么打印?

标签: c++ linux qt networking ubuntu-14.04


【解决方案1】:

我知道这是旧的,但这适用于我在 Ubuntu 16.04 LTS 上向任何听众广播消息:

QUdpSocket *udp = new UdpSocket(this);
QByteArray dgram = "hello";
udp->writeDatagram(dgram.data(), dgram.size(), QHostAddress::Broadcast, ipPort);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多