gpt4 book ai didi

linux - BeagleBone Black : Qt 5. 3 无法在 UDP 中发送数据报

转载 作者:太空狗 更新时间:2023-10-29 11:44:36 25 4
gpt4 key购买 nike

我正在开发 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

"Unable to send a message"

所以 writeDatagram 原语失败了。为我的桌面 PC 编译时,完全相同的代码工作得非常好……所以我假设代码很好,并且可能有一些与 BBB 特别相关的东西。

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

对此有什么想法吗?是否需要在 BBB 上进行配置才能使其正常工作?

* 更新 *

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

查看进程 strace(你可以看到它 here )似乎 linux 内核无法将 255.255.255.255 识别为广播地址并告知网络无法访问...

Here是我的网络配置...我觉得不错,但不要纠正我!

最佳答案

我可以在运行 2.6.32-431.20.3.el6.x86_64 的 RHEL 6 上重现这个问题。即使 bind0.0.0.0 成功,后续的 writeDatagram 也会失败。当您绑定(bind)到特定界面时,一切都运行良好。

顺便说一句,您的网络接口(interface)配置不正确,尽管我看不出仅此原因导致程序的行为有任何差异。 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;
}

关于linux - BeagleBone Black : Qt 5. 3 无法在 UDP 中发送数据报,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24866807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com