【发布时间】:2016-07-30 17:18:24
【问题描述】:
我两天以来一直在寻找如何发送 UDP 广播。我看过很多例子(还有 qt 网站上的 broadcastReceiver 和 broadcastSender ),但它们仍然不适合我。当我尝试发送广播时,方法 QUdpSocket::writeDatagram(..) 返回 -1 并且不传输数据。我在 ubuntu 14.04 x64 上。我想知道我是否应该做一些特殊的操作来使这个广播工作。感谢和抱歉我的英语水平。
这是我的代码
envoyeurUDP=new QUdpSocket(this);
recepteurUDP=new QUdpSocket(this);
//démarrage du serveur pour UDP
if (!recepteurUDP->bind(QHostAddress::AnyIPv4,7878,QUdpSocket::ShareAddress | QUdpSocket::ReuseAddressHint)) {
qDebug("Impossible de créer la socket en écoute");
exit(EXIT_FAILURE);
}
connect(recepteurUDP, SIGNAL(readyRead()), this, SLOT(lireDatagrams()));
void FileTransferManager::lireDatagrams(){
char* donnees;
while (recepteurUDP->hasPendingDatagrams()) {
QByteArray datagram;
datagram.resize(recepteurUDP->pendingDatagramSize());
recepteurUDP->readDatagram(datagram.data(), datagram.size());
donnees=datagram.data();
}}
和这个发送数据报
void FileTransferManager::sendDatagram(string msg, QHostAddress addr){
QByteArray datagram=msg.data();
qint64 r=envoyeurUDP->writeDatagram(datagram.data(), datagram.size(), addr, 7878);}
我是这样使用它的:
fileManager.sendDatagram("blabla",QHostAddress::Broadcast);
这是我的 ifconfig 命令的输出:
eth0 链路封装:以太网 HWaddr f8:a9:63:2d:89:ff
上行广播多播 MTU:1500 公制:1
数据包 reçus:0 erreurs:0 :0 overruns:0 frame:0
TX 数据包:0 错误:0 丢弃:0 超限:0 运营商:0
冲突:0 lg 文件传输:1000
Octets reçus:0 (0.0 B) Octets transmis:0 (0.0 B)
lo 链接封装:Boucle 语言环境
inet adr:127.0.0.1 面具:255.0.0.0
adrinet6:::1/128 范围:酒店
上环回运行 MTU:65536 指标:1
数据包 reçus:5311 erreurs:0 :0 overruns:0 frame:0
TX 数据包:5311 错误:0 丢弃:0 超限:0 运营商:0
冲突:0 lg 文件传输:0
Octets reçus:661728 (661.7 KB) Octets transmis:661728 (661.7 KB)
wlan0 链路封装:以太网 HWaddr b8:ee:65:ab:4f:77
inet adr:10.42.0.1 Bcast:10.42.0.255 面具:255.255.255.0 adrinet6: fe80::baee:65ff:feab:4f77/64 范围:Lien UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 数据包 reçus:14069 erreurs:0 :0 overruns:0 frame:0 TX 数据包:15529 错误:0 丢弃:0 超限:0 运营商:0 冲突:0 lg 文件传输:1000 Octets reçus:6007592 (6.0 MB) Octets transmis:2307422 (2.3 MB)
【问题讨论】:
-
需要一个简短的代码示例来演示问题。否则你可能不会在这里得到任何帮助。
ifconfig的输出也会有帮助,以检查地址是否确实被广播。 -
谢谢我已经编辑了我的帖子以便添加代码
-
有趣。调用
writeDatagram()失败后,数据报套接字上的error()和errorString()返回什么? -
errorString() 返回“无法发送消息”
-
error() 返回一个 SocketError 对象,我不知道如何打印它。怎么打印?
标签: c++ linux qt networking ubuntu-14.04