[英]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上重現此問題。 即使bind
到0.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.