qudp socket信号不触发_QT下udpsocket一段时间接收不到数据的问题

最近在做一个项目  采用UDPSOCKET进行数据的传输,发现在一段时间后,UDP接收不到数据了,找了很久的资料 才发现解决该问题的方法,估计不是最好的。代码如下:

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include

MainWindow::MainWindow(QWidget *parent) :

QMainWindow(parent),

ui(new Ui::MainWindow)

{

ui->setupUi(this);

udpsocket=new QUdpSocket(this);

udpsocket->bind (1234,QUdpSocket::ShareAddress);

connect (udpsocket,&QUdpSocket::readyRead,this,&MainWindow::slotReadyReadDatagrams);

QTimer *timer=new QTimer(this);

connect (timer,SIGNAL(timeout()),this,SLOT(timerUpDate()));

timer->start (10000);

i=0;

}

void MainWindow::slotReadyReadDatagrams ()

{

while(udpsocket->hasPendingDatagrams ())

{

i++;

QByteArray datagram;

QHostAddress senderHostAddress;

datagram.resize (udpsocket->pendingDatagramSize ());

udpsocket->readDatagram (datagram.data (),datagram.size (),&senderHostAddress);

qDebug()<

}

}

void MainWindow::timerUpDate ()

{

if(udpsocket->bytesAvailable()!=0)

{

qDebug()<

udpsocket->close ();

udpsocket=new QUdpSocket(this);

udpsocket->bind (1234,QUdpSocket::ShareAddress);

connect (udpsocket,&QUdpSocket::readyRead,this,&MainWindow::slotReadyReadDatagrams);

}

}

若接收数据正常,udpsocket->bytesAvailable()的值将为0,接收不到数据则为非零值,这样就可用个定时器,是不是的检测下,若不为零,将SOCKET重启即可。

在我的项目中,我之前断开连接是使用的disconnect来断开信号与槽函数之间的连接,但是这样有一个问题就是,不论第一次连接成功与否,第二次都连接不上,即使发送端在发送数据,也接收不到。但是参考这篇文章改用了socket->close();之后发现就可以了。

虽然问题已经解决,但是我还是不太懂我之前的做法为什么不可以,因为虽然我是用disconnect断开与槽函数的连接,但是每次使用的时候都是创建一个新的套接字,然后重新连接槽函数,所以不明白为什么这样第二次就连接不上了。作为一个小白,非常希望有懂的大神指点一下,万分感谢!

你可能感兴趣的:(qudp,socket信号不触发)