我正在使用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是我的网络配置......对我来说似乎不错,但请不要纠正我!
答案 0 :(得分:4)
我可以在运行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;
}