Merge pull request #961 from Lord-Grey/Improve_errohandling

Improve UDP-Device Error handling
This commit is contained in:
LordGrey 2020-09-05 15:14:22 +02:00 committed by GitHub
commit 31b5be39b5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 30 deletions

View File

@ -41,26 +41,26 @@ bool ProviderUdp::init(const QJsonObject &deviceConfig)
if (_address.setAddress(host) ) if (_address.setAddress(host) )
{ {
Debug( _log, "Successfully parsed %s as an ip address.", deviceConfig["host"].toString().toStdString().c_str()); Debug( _log, "Successfully parsed %s as an IP-address.", QSTRING_CSTR(_address.toString()));
} }
else else
{ {
Debug( _log, "Failed to parse [%s] as an ip address.", deviceConfig["host"].toString().toStdString().c_str()); QHostInfo hostInfo = QHostInfo::fromName(host);
QHostInfo info = QHostInfo::fromName(host); if ( hostInfo.error() == QHostInfo::NoError )
if (info.addresses().isEmpty())
{ {
Debug( _log, "Failed to parse [%s] as a hostname.", deviceConfig["host"].toString().toStdString().c_str()); _address = hostInfo.addresses().first();
QString errortext = QString ("Invalid target address [%1]!").arg(host); Debug( _log, "Successfully resolved IP-address (%s) for hostname (%s).", QSTRING_CSTR(_address.toString()), QSTRING_CSTR(host));
}
else
{
QString errortext = QString ("Failed resolving IP-address for [%1], (%2) %3").arg(host).arg(hostInfo.error()).arg(hostInfo.errorString());
this->setInError ( errortext ); this->setInError ( errortext );
return false; isInitOK = false;
}
else
{
Debug( _log, "Successfully parsed %s as a hostname.", deviceConfig["host"].toString().toStdString().c_str());
_address = info.addresses().first();
} }
} }
if ( !_isDeviceInError )
{
int config_port = deviceConfig["port"].toInt(_port); int config_port = deviceConfig["port"].toInt(_port);
if ( config_port <= 0 || config_port > MAX_PORT ) if ( config_port <= 0 || config_port > MAX_PORT )
{ {
@ -71,13 +71,14 @@ bool ProviderUdp::init(const QJsonObject &deviceConfig)
else else
{ {
_port = static_cast<int>(config_port); _port = static_cast<int>(config_port);
Debug( _log, "UDP using %s:%d", _address.toString().toStdString().c_str() , _port ); Debug( _log, "UDP socket will write to %s:%u", QSTRING_CSTR(_address.toString()) , _port );
_udpSocket = new QUdpSocket(this); _udpSocket = new QUdpSocket(this);
isInitOK = true; isInitOK = true;
} }
} }
}
return isInitOK; return isInitOK;
} }
@ -88,6 +89,8 @@ int ProviderUdp::open()
// Try to bind the UDP-Socket // Try to bind the UDP-Socket
if ( _udpSocket != nullptr ) if ( _udpSocket != nullptr )
{
if ( _udpSocket->state() != QAbstractSocket::BoundState )
{ {
QHostAddress localAddress = QHostAddress::Any; QHostAddress localAddress = QHostAddress::Any;
quint16 localPort = 0; quint16 localPort = 0;
@ -96,6 +99,7 @@ int ProviderUdp::open()
QString warntext = QString ("Could not bind local address: %1, (%2) %3").arg(localAddress.toString()).arg(_udpSocket->error()).arg(_udpSocket->errorString()); QString warntext = QString ("Could not bind local address: %1, (%2) %3").arg(localAddress.toString()).arg(_udpSocket->error()).arg(_udpSocket->errorString());
Warning ( _log, "%s", QSTRING_CSTR(warntext)); Warning ( _log, "%s", QSTRING_CSTR(warntext));
} }
}
// Everything is OK, device is ready // Everything is OK, device is ready
_isDeviceReady = true; _isDeviceReady = true;
retval = 0; retval = 0;
@ -125,7 +129,7 @@ int ProviderUdp::close()
return retval; return retval;
} }
int ProviderUdp::writeBytes(unsigned size, const uint8_t * data) int ProviderUdp::writeBytes(const unsigned size, const uint8_t * data)
{ {
qint64 retVal = _udpSocket->writeDatagram((const char *)data,size,_address,_port); qint64 retVal = _udpSocket->writeDatagram((const char *)data,size,_address,_port);

View File

@ -61,12 +61,12 @@ protected:
/// ///
/// @return Zero on success, else negative /// @return Zero on success, else negative
/// ///
int writeBytes(unsigned size, const uint8_t *data); int writeBytes(const unsigned size, const uint8_t *data);
/// ///
QUdpSocket * _udpSocket; QUdpSocket * _udpSocket;
QHostAddress _address; QHostAddress _address;
ushort _port; quint16 _port;
QString _defaultHost; QString _defaultHost;
}; };