关于QT中Udp通信绑定本机发送端口失败的原因

最近在使用QT内部自带的通信套接字进行UDP通信时候会出现nind()指定端口时无法绑定的问题,最后发现问题的解决方式,setProxy(QNetworkProxy::NoProxy);(关闭代理),代码示例如下

//实例化对象

void ucpLED::initForm()
{
//实例化对象并绑定信号槽
udpLEDSocket0 = new QUdpSocket(this);
connect(udpLEDSocket0, SIGNAL(readyRead()), this, SLOT(readData()));
#if (QT_VERSION >= QT_VERSION_CHECK(6,0,0))
connect(udpSocket0, SIGNAL(errorOccurred(QAbstractSocket::SocketError)), this, SLOT(error()));
#else
connect(udpLEDSocket0, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(error()));
#endif

//定时器发送数据
timerLed = new QTimer(this);
connect(timerLed, SIGNAL(timeout()), this, SLOT(on_btnSend_clicked()));
}

//监听端口读取数据

void ucpLED::readData() {
QHostAddress host;
quint16 port;
QByteArray data;
QString buffer;
//判断是否存在可读数据
while (udpLEDSocket0->hasPendingDatagrams()) {
//计算数据长度
data.resize(udpLEDSocket0->pendingDatagramSize());
//读取数据报文
udpLEDSocket0->readDatagram(data.data(), data.size(), &host, &port);
QString ip = host.toString();
if (ip.isEmpty()) {
continue;
}

}
}

//错误信息
void ucpLED::error()
{
    qDebug() << QObject::tr("LEDUDP通信错误") << endl;
}

 

//发送数据

void ucpLED::Send_LED_Data()
{
QByteArray buffer;
buffer = ....

if (udpLEDSocket0->localPort() != App::HostIp3.split("/").at(1).toInt()) {

//终止当前连接并重置套接字
udpLEDSocket0->abort();
udpLEDSocket0->setProxy(QNetworkProxy::NoProxy);
//bind地址簇绑定:用于发送数据
udpLEDSocket0->bind(QHostAddress(App::HostIp3.split("/").at(0)), App::HostIp3.split("/").at(1).toInt());
}

//指定地址和端口发送数据
udpLEDSocket0->writeDatagram(buffer, QHostAddress(App::ControllerIp3.split("/").at(0)), App::ControllerIp3.split("/").at(1).toInt());
}

 其他关于通信代理的博客:

(17条消息) Qt网络编程:QNetworkProxy_qt运行时有proxy错误_友善啊,朋友的博客-CSDN博客

Qt之QNetworkProxy(网络代理) - 挨踢人啊 - 博客园 (cnblogs.com)

posted @ 2023-06-25 14:17  屁屁-rtq  阅读(809)  评论(0编辑  收藏  举报