コード例 #1
0
ファイル: client.cpp プロジェクト: Delta3system/delta3-server
    void Client::onDataReceived()
    {
        qDebug() << "onDataReceived():";
        buf_+=socket_->readAll();
        setSeen();

        if (buf_.size()<3) return; // if we don't read header

        if (getProtoId(buf_)!=CSPYP1_PROTOCOL_ID ||
                getProtoVersion(buf_)!=CSPYP1_PROTOCOL_VERSION)
        {
            // wrong packet - disconnecting client
            qDebug() << "PROTOCOL ERROR!";
            disconnectFromHost();
            return;
        }


        const Cspyp1Command command = getCommand(buf_);
        for (quint32 i = 0; i < sizeof(CommandTable) / sizeof(*CommandTable); ++i)
        {
            if (CommandTable[i].command == command)
            {
                (this->*CommandTable[i].function)();
                return;
            }
        }

        qDebug() << "PROTOCOL ERROR!";
        disconnectFromHost();
    }
コード例 #2
0
void QXmppIncomingClient::onDigestReply()
{
    QXmppPasswordReply *reply = qobject_cast<QXmppPasswordReply *> (sender());

    if (!reply)
        return;

    reply->deleteLater();

    if (reply->error() == QXmppPasswordReply::TemporaryError)
    {
        warning (QString ("Temporary authentication failure for '%1' from %2").arg (d->saslServer->username(), d->origin()));
        updateCounter ("incoming-client.auth.temporary-auth-failure");
        sendPacket (QXmppSaslFailure ("temporary-auth-failure"));
        disconnectFromHost();
        return;
    }

    QByteArray challenge;
    d->saslServer->setPasswordDigest (reply->digest());

    QXmppSaslServer::Response result = d->saslServer->respond (reply->property ("__sasl_raw").toByteArray(), challenge);

    if (result != QXmppSaslServer::Challenge)
    {
        warning (QString ("Authentication failed for '%1' from %2").arg (d->saslServer->username(), d->origin()));
        updateCounter ("incoming-client.auth.not-authorized");
        sendPacket (QXmppSaslFailure ("not-authorized"));
        disconnectFromHost();
        return;
    }

    // send new challenge
    sendPacket (QXmppSaslChallenge (challenge));
}
コード例 #3
0
void QXmppIncomingClient::onPasswordReply()
{
    QXmppPasswordReply *reply = qobject_cast<QXmppPasswordReply*>(sender());
    if (!reply)
        return;
    reply->deleteLater();

    const QString username = reply->property("__sasl_username").toString();
    switch (reply->error()) {
    case QXmppPasswordReply::NoError:
        d->username = username;
        info(QString("Authentication succeeded for '%1'").arg(username));
        sendData("<success xmlns='urn:ietf:params:xml:ns:xmpp-sasl'/>");
        break;
    case QXmppPasswordReply::AuthorizationError:
        warning(QString("Authentication failed for '%1'").arg(username));
        sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure>");
        disconnectFromHost();
        break;
    case QXmppPasswordReply::TemporaryError:
        warning(QString("Temporary authentication failure for '%1'").arg(username));
        sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><temporary-auth-failure/></failure>");
        disconnectFromHost();
        break;
    }
}
コード例 #4
0
void QXmppIncomingServer::slotDialbackResponseReceived(const QXmppDialback &dialback)
{
    QXmppOutgoingServer *stream = qobject_cast<QXmppOutgoingServer*>(sender());
    if (!stream ||
        dialback.command() != QXmppDialback::Verify ||
        dialback.id() != d->localStreamId ||
        dialback.from() != stream->remoteDomain())
        return;

    // relay verify response
    QXmppDialback response;
    response.setCommand(QXmppDialback::Result);
    response.setTo(dialback.from());
    response.setFrom(d->domain);
    response.setType(dialback.type());
    sendPacket(response);

    // check for success
    if (response.type() == QLatin1String("valid"))
    {
        info(QString("Verified incoming domain '%1' on %2").arg(dialback.from(), d->origin()));
        const bool wasConnected = !d->authenticated.isEmpty();
        d->authenticated.insert(dialback.from());
        if (!wasConnected)
            emit connected();
    } else {
        warning(QString("Failed to verify incoming domain '%1' on %2").arg(dialback.from(), d->origin()));
        disconnectFromHost();
    }

    // disconnect dialback
    stream->disconnectFromHost();
    stream->deleteLater();
}
コード例 #5
0
void
ScrobSocket::onReadyRead()
{
    QByteArray bytes = readAll();
    if (bytes != "OK\n") qWarning() << bytes.trimmed();
    disconnectFromHost();
}
コード例 #6
0
ファイル: QXmppOutgoingClient.cpp プロジェクト: cmoede/qxmpp
void QXmppOutgoingClient::handleStream(const QDomElement &streamElement)
{
    if (d->state == QXmppOutgoingClientPrivate::Unset ||
          d->state == QXmppOutgoingClientPrivate::TLSStarted ||
          d->state == QXmppOutgoingClientPrivate::Authenticated) {
        d->state = QXmppOutgoingClientPrivate::WaitingForStreamFeatures;
    } else {
        warning("handleStart in invalid state - disconnecting");
        disconnectFromHost();
        return;
    }



    if(d->streamId.isEmpty())
        d->streamId = streamElement.attribute("id");
    if (d->streamFrom.isEmpty())
        d->streamFrom = streamElement.attribute("from");
    if(d->streamVersion.isEmpty())
    {
        d->streamVersion = streamElement.attribute("version");

        // no version specified, signals XMPP Version < 1.0.
        // switch to old auth mechanism if enabled
        if(d->streamVersion.isEmpty() && configuration().useNonSASLAuthentication()) {
            sendNonSASLAuthQuery();
        }
    }
}
コード例 #7
0
ファイル: boxitsocket.cpp プロジェクト: fatman2021/boxit
void BoxitSocket::timeOutDestroy() {
    timeoutCount += 5;

    // Disconnect after 3 minutes...
    if (timeoutCount >= 180)
        disconnectFromHost();
}
コード例 #8
0
void QAsioTcpSocketParentPrivate::connectedHandler(const boost::system::error_code& error, boost::asio::ip::tcp::resolver::iterator iter)
{
    if (!error) {
        if (data_){
            state_ = QAsioTcpSocketParent::ConnectedState;
            erro_site = QAsioTcpSocketParent::NoError;
            boost::asio::ip::tcp::endpoint peerPoint = socket_->remote_endpoint(erro_code);
            peerIp = QString::fromStdString(peerPoint.address().to_string());
            peerPort = peerPoint.port();
            if (q) {
                q->hostConnected();
                socket_->async_read_some(boost::asio::buffer(data_,byteSize_),
                                         stand_->wrap(boost::bind(&QAsioTcpSocketParentPrivate::readHandler,shared_from_this(),
                                                     boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred)));
                setHeartTimeOut();
            }
        } else {
            disconnectFromHost();
            setError(error,QAsioTcpSocketParent::NoBufferSize);
        }
    } else {
        boost::asio::ip::tcp::resolver::iterator end;
        if(iter == end)
        {
            setError(error,QAsioTcpSocketParent::ConnectEorro);
        }
    }
}
コード例 #9
0
void SmppClient::printErrorAndDisconnect(const Smpp::Error &e)
{
    logMsg(QString("error: %e").arg(e.what()));
    m_needInformAbountDisconnect = false;
    emit disconnected(UnknownError);
    disconnectFromHost();
}
コード例 #10
0
ファイル: QXmppStream.cpp プロジェクト: misterion/qxmpp
void QXmppStream::_q_socketReadyRead()
{
    d->dataBuffer.append(d->socket->readAll());

    // handle whitespace pings
    if (!d->dataBuffer.isEmpty() && d->dataBuffer.trimmed().isEmpty()) {
        d->dataBuffer.clear();
        handleStanza(QDomElement());
    }

    // FIXME : maybe these QRegExps could be static?
    QRegExp startStreamRegex("^(<\\?xml.*\\?>)?\\s*<stream:stream.*>");
    startStreamRegex.setMinimal(true);
    QRegExp endStreamRegex("</stream:stream>$");
    endStreamRegex.setMinimal(true);

    // check whether we need to add stream start / end elements
    //
    // NOTE: as we may only have partial XML content, do not alter the stream's
    // state until we have a valid XML document!
    QByteArray completeXml = d->dataBuffer;
    const QString strData = QString::fromUtf8(d->dataBuffer);
    bool streamStart = false;
    if (d->streamStart.isEmpty() && strData.contains(startStreamRegex))
        streamStart = true;
    else
        completeXml.prepend(d->streamStart);
    bool streamEnd = false;
    if (strData.contains(endStreamRegex))
        streamEnd = true;
    else
        completeXml.append(streamRootElementEnd);

    // check whether we have a valid XML document
    QDomDocument doc;
    if (!doc.setContent(completeXml, true))
        return;

    // remove data from buffer
    logReceived(strData);
    d->dataBuffer.clear();

    // process stream start
    if (streamStart) {
        d->streamStart = startStreamRegex.cap(0).toUtf8();
        handleStream(doc.documentElement());
    }

    // process stanzas
    QDomElement nodeRecv = doc.documentElement().firstChildElement();
    while (!nodeRecv.isNull()) {
        handleStanza(nodeRecv);
        nodeRecv = nodeRecv.nextSiblingElement();
    }

    // process stream end
    if (streamEnd)
        disconnectFromHost();
}
コード例 #11
0
void QXmppIncomingClient::onTimeout()
{
    warning (QString ("Idle timeout for '%1' from %2").arg (d->jid, d->origin()));
    disconnectFromHost();

    // make sure disconnected() gets emitted no matter what
    QTimer::singleShot (30, this, SIGNAL (disconnected()));
}
コード例 #12
0
void QAsioTcpSocketParentPrivate::writeHandler(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    if (!error && q){
        if (!q->writeDataed(bytes_transferred))
            disconnectFromHost();
    } else {
        setError(error,QAsioTcpSocketParent::WriteEorro);
    }
}
コード例 #13
0
ファイル: caster.cpp プロジェクト: jhenstridge/cast-app
void Caster::onChannelClosed() {
    Channel *c = static_cast<Channel*>(sender());

    channels_.erase({c->destination_id_, c->source_id_});
    if (c == platform_channel_) {
        disconnectFromHost();
    }
    c->deleteLater();
}
コード例 #14
0
ファイル: FrostbiteClient.cpp プロジェクト: OpenRcon/OpenRcon
void FrostbiteClient::onVersionCommand(const QString &type, int build)
{
    Q_UNUSED(build);

    if (GameType::fromString(type) != serverEntry->getGameType()) {
        disconnectFromHost();

        qDebug() << tr("Wrong server type, disconnecting...");
    }
}
コード例 #15
0
ファイル: sockethandler.cpp プロジェクト: intermet/GladiaBot
    void SocketHandler::resetConnection(const QString &IP, int port)
    {
        _errorAppend = false;
        _errorString = "";

        if (_isConnected)
            disconnectFromHost();
        connectToHost(IP, port);
        _isConnected = true;
    }
コード例 #16
0
void QXmppIncomingServer::handleStanza(const QDomElement &stanza)
{
    const QString ns = stanza.namespaceURI();

    if (ns == ns_tls && stanza.tagName() == QLatin1String("starttls"))
    {
        sendData("<proceed xmlns='urn:ietf:params:xml:ns:xmpp-tls'/>");
        socket()->flush();
        socket()->startServerEncryption();
        return;
    }
    else if (QXmppDialback::isDialback(stanza))
    {
        QXmppDialback request;
        request.parse(stanza);
        // check the request is valid
        if (!request.type().isEmpty() ||
            request.from().isEmpty() ||
            request.to() != d->domain ||
            request.key().isEmpty())
        {
            warning(QString("Invalid dialback received on %1").arg(d->origin()));
            return;
        }

        const QString domain = request.from();
        if (request.command() == QXmppDialback::Result)
        {
            debug(QString("Received a dialback result from '%1' on %2").arg(domain, d->origin()));

            // establish dialback connection
            QXmppOutgoingServer *stream = new QXmppOutgoingServer(d->domain, this);
            bool check = connect(stream, SIGNAL(dialbackResponseReceived(QXmppDialback)),
                                 this, SLOT(slotDialbackResponseReceived(QXmppDialback)));
            Q_ASSERT(check);
            Q_UNUSED(check);
            stream->setVerify(d->localStreamId, request.key());
            stream->connectToHost(domain);
        }
        else if (request.command() == QXmppDialback::Verify)
        {
            debug(QString("Received a dialback verify from '%1' on %2").arg(domain, d->origin()));
            emit dialbackRequestReceived(request);
        }

    }
    else if (d->authenticated.contains(QXmppUtils::jidToDomain(stanza.attribute("from"))))
    {
        // relay stanza if the remote party is authenticated
        emit elementReceived(stanza);
    } else {
        warning(QString("Received an element from unverified domain '%1' on %2").arg(QXmppUtils::jidToDomain(stanza.attribute("from")), d->origin()));
        disconnectFromHost();
    }
}
コード例 #17
0
void QAsioWebSocketParent::open(const QString & url)
{
    if (_State == ConnectedState)
        disconnectFromHost();
    if (!Url::fromString(url,m_url)) {
        emit error(tr("Invalid URL."));
        return;
    }
    _State = ConnectingState;

}
コード例 #18
0
ファイル: chatserver.cpp プロジェクト: geekskick/PatChat
void ChatServer::setIPAddressAndPort(QString ip, int port){
    qDebug()<<"changing destination";

    SocketState s = this->state();
    this->_ipAddr = ip;
    this->_port = port;

    if(s == ConnectedState){
        qDebug() << "Reconnecting";
        emit disconnectFromHost();
        emit reConnect();
    }
}
コード例 #19
0
void MainWindow::closeEvent(QCloseEvent*)
{
    grabZoomKeys(false);

    QSettings settings;
    settings.setValue("show_toolbar", show_toolbar->isChecked());
    settings.setValue("zoomlevel", zoom_slider->value());
    settings.sync();

    hide();

    disconnectFromHost();
}
コード例 #20
0
void QXmppIncomingClient::handleStream(const QDomElement &streamElement)
{
    if (d->idleTimer->interval())
        d->idleTimer->start();
    d->saslStep = 0;

    // start stream
    const QByteArray sessionId = generateStanzaHash().toAscii();
    QString response = QString("<?xml version='1.0'?><stream:stream"
        " xmlns=\"%1\" xmlns:stream=\"%2\""
        " id=\"%3\" from=\"%4\" version=\"1.0\" xml:lang=\"en\">").arg(
        ns_client,
        ns_stream,
        sessionId,
        d->domain.toAscii());
    sendData(response.toUtf8());

    // check requested domain
    if (streamElement.attribute("to") != d->domain)
    {
        QString response = QString("<stream:error>"
            "<host-unknown xmlns=\"urn:ietf:params:xml:ns:xmpp-streams\"/>"
            "<text xmlns=\"urn:ietf:params:xml:ns:xmpp-streams\">"
                "This server does not serve %1"
            "</text>"
            "</stream:error>").arg(streamElement.attribute("to"));
        sendData(response.toUtf8());
        disconnectFromHost();
        return;
    }

    // send stream features
    QXmppStreamFeatures features;
    if (socket() && !socket()->isEncrypted() && !socket()->localCertificate().isNull() && !socket()->privateKey().isNull())
        features.setTlsMode(QXmppStreamFeatures::Enabled);
    if (!d->username.isEmpty())
    {
        features.setBindMode(QXmppStreamFeatures::Required);
        features.setSessionMode(QXmppStreamFeatures::Enabled);
    }
    else if (d->passwordChecker)
    {
        QList<QXmppConfiguration::SASLAuthMechanism> mechanisms;
        mechanisms << QXmppConfiguration::SASLPlain;
        if (d->passwordChecker->hasGetPassword())
            mechanisms << QXmppConfiguration::SASLDigestMD5;
        features.setAuthMechanisms(mechanisms);
    }
    sendPacket(features);
}
コード例 #21
0
void QXmppIncomingClient::onDigestReply()
{
    QXmppPasswordReply *reply = qobject_cast<QXmppPasswordReply*>(sender());
    if (!reply)
        return;
    reply->deleteLater();

    const QMap<QByteArray, QByteArray> saslResponse = QXmppSaslDigestMd5::parseMessage(reply->property("__sasl_raw").toByteArray());
    const QString username = QString::fromUtf8(saslResponse.value("username"));
    if (reply->error() == QXmppPasswordReply::TemporaryError) {
        warning(QString("Temporary authentication failure for '%1'").arg(username));
        sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><temporary-auth-failure/></failure>");
        disconnectFromHost();
        return;
    }

    d->saslDigest.setSecret(reply->digest());
    d->saslDigest.setDigestUri(saslResponse.value("digest-uri"));
    d->saslDigest.setNc(saslResponse.value("nc"));
    d->saslDigest.setCnonce(saslResponse.value("cnonce"));
    if (saslResponse.value("response") != d->saslDigest.calculateDigest(
            QByteArray("AUTHENTICATE:") + d->saslDigest.digestUri()))
    {
        sendData("<failure xmlns='urn:ietf:params:xml:ns:xmpp-sasl'><not-authorized/></failure>");
        disconnectFromHost();
        return;
    }

    // send new challenge
    d->username = username;
    d->saslStep = 2;
    QMap<QByteArray, QByteArray> challenge;
    challenge["rspauth"] = d->saslDigest.calculateDigest(
        QByteArray(":") + d->saslDigest.digestUri());
    const QByteArray data = QXmppSaslDigestMd5::serializeMessage(challenge).toBase64();
    sendData("<challenge xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>" + data +"</challenge>");
}
コード例 #22
0
void QXmppIncomingClient::onPasswordReply()
{
    QXmppPasswordReply *reply = qobject_cast<QXmppPasswordReply *> (sender());

    if (!reply)
        return;

    reply->deleteLater();

    const QString jid = QString ("%1@%2").arg (d->saslServer->username(), d->domain);

    switch (reply->error())
    {
        case QXmppPasswordReply::NoError:
            d->jid = jid;
            info (QString ("Authentication succeeded for '%1' from %2").arg (d->jid, d->origin()));
            updateCounter ("incoming-client.auth.success");
            sendPacket (QXmppSaslSuccess());
            handleStart();
            break;

        case QXmppPasswordReply::AuthorizationError:
            warning (QString ("Authentication failed for '%1' from %2").arg (jid, d->origin()));
            updateCounter ("incoming-client.auth.not-authorized");
            sendPacket (QXmppSaslFailure ("not-authorized"));
            disconnectFromHost();
            break;

        case QXmppPasswordReply::TemporaryError:
            warning (QString ("Temporary authentication failure for '%1' from %2").arg (jid, d->origin()));
            updateCounter ("incoming-client.auth.temporary-auth-failure");
            sendPacket (QXmppSaslFailure ("temporary-auth-failure"));
            disconnectFromHost();
            break;
    }
}
コード例 #23
0
ファイル: qssl.cpp プロジェクト: tuxmaster/QSSL
void QFrankSSL::VerbindungTrennen()
{
#ifndef QT_NO_DEBUG
	qDebug("%s VerbindungTrennen",this->metaObject()->className());
#endif
	if(K_SSLStruktur==NULL)
		return;
	K_Verbindungsstatus=QFrankSSL::TRENNEN;
	if(SSL_shutdown(K_SSLStruktur)==0)
		SSL_shutdown(K_SSLStruktur);
	if(K_MussWasGesendetWerden())
			K_DatenSenden();
	else
		disconnectFromHost();	
}
コード例 #24
0
ファイル: tsocket.cpp プロジェクト: petrpopov/db_transactions
void TSocket::readClient()
{
        qDebug() << "Client connected";

        //read client query
        QByteArray in1;

        in1 = readAll();
        qDebug() << in1;

        QString data = QString::fromLocal8Bit( in1.data() );
        QStringList list = data.simplified().split("\n");

        data = list.at(0);


        // send
        execQuery( data );
        QDataStream out( this );
        out << qint64( 0xFFFF );

        close();
        disconnectFromHost();
        waitForDisconnected();

       /* QFile file("C:\\tt.txt");
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
            return;

        QTextStream in(&file);

        while( !in.atEnd() )
        {
            QString str = in.readLine();
            sendString( str );
        }

        file.close();

        QDataStream out( this );
        out << qint64( 0xFFFF );

        close();*/
        //disconnectFromHost();
        //waitForDisconnected();
}
コード例 #25
0
ファイル: qssl.cpp プロジェクト: tuxmaster/QSSL
void QFrankSSL::K_AllesZuruecksetzen()
{	
#ifndef QT_NO_DEBUG
	qDebug("%s K_AllesZuruecksetzen",this->metaObject()->className());
#endif
	if(state()==QAbstractSocket::ConnectedState)
		disconnectFromHost();
	//SSL Struktur löschen
	if(K_SSLStruktur!=NULL)
	{
		if(K_ListeDerSSLVerbindungen.contains(K_SSLStruktur))
			K_ListeDerSSLVerbindungen.remove(K_SSLStruktur);
		SSL_free(K_SSLStruktur);		
	}
	K_SSLStruktur=NULL;
	K_Verbindungsstatus=QFrankSSL::GETRENNT;
}
コード例 #26
0
ファイル: client.cpp プロジェクト: donle-duplicate/QSanguosha
void Client::checkVersion(const QString &server_version){
    QString client_version = Sanguosha->getVersion();

    if(server_version == client_version)
        return;

    static QString link = "http://github.com/Moligaloo/QSanguosha/downloads";
    QString text = tr("Server version is %1, client version is %2 <br/>").arg(server_version).arg(client_version);
    if(server_version > client_version)
        text.append(tr("Your client version is older than the server's, please update it <br/>"));
    else
        text.append(tr("The server version is older than your client version, please ask the server to update<br/>"));

    text.append(tr("Download link : <a href='%1'>%1</a> <br/>").arg(link));
    QMessageBox::warning(NULL, tr("Warning"), text);

    disconnectFromHost();
}
コード例 #27
0
ファイル: pserver.cpp プロジェクト: Karamax/Pastexen
void pServer::onConnection()
{
    auto socket = _server.nextPendingConnection();

    auto addr = socket->peerAddress();
    auto it = _limits.find(addr);
    if (it == _limits.end()) {
        it = _limits.insert(addr, 0);
    } else {
        if (it.value() > pServer::LIMIT) {
            socket->disconnectFromHost();
            socket->deleteLater();
            return;
        }
    }
//    qDebug() << "Connected: " << socket->peerAddress().toString() << " with used limit " << it.value() << " bytes";
    new pSocket(socket, pThreadPool::getNextThread(), it.value());
    Logger::log(socket->peerAddress().toString() + socket->peerName(), it.value());
}
コード例 #28
0
void QAsioTcpSocketParentPrivate::readHandler(const boost::system::error_code& error, std::size_t bytes_transferred)
{
    if(!error){
        if (bytes_transferred == 0){
            disconnectFromHost();
            return;
        }
        if (q) {
            q->readDataed(data_,bytes_transferred);
            socket_->async_read_some(boost::asio::buffer(data_,byteSize_),
                                     stand_->wrap(boost::bind(&QAsioTcpSocketParentPrivate::readHandler,shared_from_this(),
                                                              boost::asio::placeholders::error,boost::asio::placeholders::bytes_transferred)));
            if (timer && (timeOut_s > 0 )) {
                timer->expires_from_now(boost::posix_time::seconds(timeOut_s));
            }
        }

    } else {
        setError(error,QAsioTcpSocketParent::ReadError);
    }
}
コード例 #29
0
void QAsioWebSocketParent::hostConnected()
{
    if (!isServer) { //连接后,发送websocket协议的http请求
        m_key = generateKey();
        const QString handshake =
                createHandShakeRequest(m_url.ResourceName(),
                                       m_url.Host()
                                            % QStringLiteral(":")
                                            % QString::number(m_url.port(80)),
                                       m_origin,
                                       QString(),
                                       QString(),
                                       m_key);//新建key
        if (handshake.isEmpty()) {
            disconnectFromHost();
            emit error(tr("链接发送数据错误"));
            return;
        }
        write(handshake.toLatin1());//发送key
    }
}
コード例 #30
0
ファイル: eventclient.cpp プロジェクト: AchimTuran/kodimote
void EventClient::connectToHost(KodiHost *host)
{
    if (m_socket >= 0)  {
        disconnectFromHost();
    }

    m_kodiHost = CAddress(host->address().toLatin1().data());

    m_socket = socket(AF_INET, SOCK_DGRAM, 0);
    if (m_socket < 0) {
        qDebug() << "cannot create socket";
    }
    m_kodiHost.Bind(m_socket);

    if (!m_thumbnail.isEmpty()) {
        CPacketHELO HeloPackage("Kodimote", ICON_PNG, m_thumbnail.toLatin1().data());
        HeloPackage.Send(m_socket, m_kodiHost);
    } else {
        CPacketHELO HeloPackage("Kodimote", ICON_NONE);
        HeloPackage.Send(m_socket, m_kodiHost);
    }

    qDebug() << "connected to kodi" << m_socket;
}