关于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());
}
其他关于通信代理的博客: