首页| 论坛| 消息
主题:QT网络通信 UDP广播+多线程问题
回帖:问题解决了,上完整的代码

发送端界面cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include "udpsend.h"
#include

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

int num=0;
QMutex mutex;

void MainWindow::on_pushButton_clicked()
{
UdpSend *thread[5];
for(int i=0;isetupUi(this);
udpsocket=new QUdpSocket(this);
udpsocket->bind(QHostAddress::AnyIPv4,quint16(5555));
connect(udpsocket,SIGNAL(readyRead()),this,SLOT(ricv_msg()));
}

MainWindow::~MainWindow()
{
delete ui;
}

void MainWindow::ricv_msg()
{
QHostAddress sendID;
quint16 sendport;
QByteArray data;
if(udpsocket->hasPendingDatagrams())
{
data.resize(udpsocket->pendingDatagramSize());
udpsocket->readDatagram(data.data(),data.size(),&sendID,&sendport);
}
QString str="发送端的IP:"+sendID.toString()+"端口号:"+QString::number(sendport)+"内容:"+data;
ui->textBrowser->append(str);
}

总结一下
1.首先使用循环创建多线程时需要加锁
2.在接收端的接收函数不要使用while(udpsocket->hasPendingDatagrams()),而要用if(udpsocket->hasPendingDatagrams())
3.接收数据的大小不能用data.resize(udpsocket->bytesAvailable());,而要用data.resize(udpsocket->pendingDatagramSize());,否则可能会有接收大小不一致,会导致出现意外乱码
以上代码为我个人意见,若有问题请指出来共同进步
下一楼›:suzhuorui:问题解决了,上完整的代码

发送端界面cpp
#include "mainwindow.h ..
‹上一楼:青空飞羽:
UdpSend中的udpSocket应该放在run方法里去new吧,这样udpSocket才是属于线程,放 ..

查看全部回帖(11)
«返回主帖