BeagleBone Black:Qt 5.3无法在UDP中发送数据报

时间:2014-07-21 13:52:35

标签: linux qt sockets udp beagleboneblack

我正在使用BeagleBone Black(运行Debian Linux),我正在尝试使用Qt 5.3将一些数据报发送到UDP广播。

这是我的代码:

#include <QCoreApplication>
#include <QUdpSocket>
#include <QDebug>

#include <sys/socket.h>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QUdpSocket socket;

    socket.bind(QHostAddress::AnyIPv4, 1111);

    int opt=1;
    setsockopt(socket.socketDescriptor(), SOL_SOCKET, SO_BROADCAST, &opt, sizeof(int));

    QByteArray d = QString("Hello, world!").toLatin1();
    int r = socket.writeDatagram(d, QHostAddress::Broadcast, 1111);

    qDebug() << r;
    qDebug() << socket.error();
    qDebug() << socket.errorString();

    return a.exec();
}

不幸的是它不起作用,程序的输出是:

  

-1

     

QAbstractSocket :: NetworkError

     

&#34;无法发送消息&#34;

因此writeDatagram原语失败。在为我的桌面PC编译时,完全相同的代码完全正常...所以我假设代码很好,可能还有与BBB特别相关的东西。

我还尝试将数据报发送到特定的IP地址(而不是广播),但它没有改变:BBB似乎根本无法发送UDP数据包......

有关于此的任何想法?是否有什么东西可以在BBB上配置让它工作?

*更新*

我稍微修改了代码,以便在该套接字上显式启用SO_BROADCAST并将套接字绑定到任何IPv4接口(只是为了测试),但它无论如何都不起作用......

查看进程strace(你可以看到它here)似乎linux内核无法识别255.255.255.255作为广播地址并告诉网络是不可缓存的......

Here是我的网络配置......对我来说似乎不错,但请不要纠正我!

1 个答案:

答案 0 :(得分:4)

我可以在运行2.6.32-431.20.3.el6.x86_64的RHEL 6上重现此问题。即使bind0.0.0.0成功,后续writeDatagram也会失败。当你绑定到特定的接口时,事情会很好地工作。

顺便说一句,您的网络接口配置不正确,即使由于此原因我无法看到程序行为的任何差异。您eth0上的广播地址应为192.168.79.255不是 255.255.255.255

#include <QCoreApplication>
#include <QUdpSocket>
#include <QNetworkInterface>
#include <QDebug>

int main(int argc, char *argv[])
{
   QCoreApplication a(argc, argv);
   QUdpSocket socket;

   QList<QHostAddress> ifAddrs = QNetworkInterface::allAddresses();
   qDebug() << ifAddrs;

   QHostAddress ifAddr(QHostAddress::Any);
   foreach (QHostAddress ia, ifAddrs) {
      if (ia.protocol() == QAbstractSocket::IPv6Protocol) continue;
      if (ia.isInSubnet(QHostAddress::LocalHost, 8)) continue;
      ifAddr = ia;
      break;
   }
   if (false) ifAddr = QHostAddress::Any; // *** Change to if (true) to make the write fail.
   qDebug() << ifAddr;

   if (!socket.bind(ifAddr, 1111)) {
      qDebug() << "bind failed" << socket.error();
   }

   QByteArray d = QString("Hello, world!").toLatin1();
   int r = socket.writeDatagram(d, QHostAddress::Broadcast, 1111);

   qDebug() << r;
   if (r < 0) {
      qDebug() << socket.error();
      qDebug() << socket.errorString();
   }

   return 0;
}