簡體   English   中英

BeagleBone Black:Qt 5.3無法在UDP中發送數據報

[英]BeagleBone Black: Qt 5.3 fails to send datagrams in UDP

我正在開發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

“無法發送消息”

因此writeDatagram原語失敗。 當為我的台式PC編譯時,相同的精確代碼也可以正常工作。因此,我假設代碼是好的,並且可能與BBB特別相關。

我也嘗試將數據報發送到特定的IP地址(而不是廣播),但是它沒有改變:BBB似乎根本無法發送UDP數據包...

有什么想法嗎? 在BBB上是否需要配置一些功能以使其正常工作?

*更新*

我略微修改了代碼,以在該套接字上顯式啟用SO_BROADCAST並將該套接字綁定到任何IPv4接口(僅用於測試),但無論如何都無法正常工作...

查看process strace (您可以在這里看到它),看來Linux內核無法將255.255.255.255識別為廣播地址,並告訴網絡無法到達...

是我的網絡配置...對我來說似乎不錯,但請糾正我!

我可以在運行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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM