QNativeSocketEngine::bind() was not called in QAbstractSocket::UnconnectedState

Рейтинг: -1Ответов: 1Опубликовано: 27.07.2023

Не могу понять в чём заключается ошибка , а точнее как её решить.

при старте запускатеся

void MainWindow::on_pB_start_clicked()
{
    // тут комутирую сигнал, если
    // не по локальной сети и не на мой порт , то
    // конетками не соединяю отправку сигнала и мой график
    // если да то да

    str_ip = ui->lE_enover_id->text();
    str_port = ui->lE_enover_port->text();

    //то отправляем по локальному хосту
    if ( str_ip.isEmpty()  == true )
    {
        int int_port = str_port.toInt(); // превращаем в инты
        m_pudp->bind(QHostAddress::LocalHost, int_port);
    }
    else
    {
        int int_port = str_port.toInt(); // превращаем в инты
        m_pudp->bind(QHostAddress(str_ip), int_port);
    }

    // тут запуск секундомера
    // и при его сробатывании отправляется сообщение  числом в нутри
    timer_start->start(500); // 0.5 секунд

    ui->pB_start->setEnabled(false); // блокируем чтоб заново связ не тянули
}

потом отправка сообщения

// тут отправляем сообщение
void MainWindow::onTimeoutStart()
{

    str_ip = ui->lE_enover_id->text();
    str_port = ui->lE_enover_port->text();
    int_port = str_port.toInt(); // превращаем в инты

     // сообщение
    // состоит из двух чисел первое Х второе У
    if(grad >=360 )
    {
        grad = 0;
    }
    data_x = 10 * sin(grad);
    grad = grad + 5;
    if(data_y >= 100)
        data_y = 0;
    data_y = data_y + 1;

    //отправка
    QByteArray baDatagram_out;
    QDataStream out(&baDatagram_out, QIODevice::WriteOnly);
    out.setVersion(QDataStream::Qt_5_3);
    out << data_x;
    out << data_y;
    if(ui->lE_enover_id->text().isEmpty() == true)
    {
        m_pudp->writeDatagram(baDatagram_out, QHostAddress::LocalHost, int_port);
    }
    else
    {
        m_pudp->writeDatagram(baDatagram_out, QHostAddress(str_ip),  int_port);
    }
}

тут приём отдельным сокетом :

// тут принимаем сообщение ( постоянно в течении 0ю5 сек)
void MainWindow::onTimeoutPlot()
{

    //! если айпишник сменился то закрываем связь и сновоа делаем соединение
    // первичный запуск
    if(ip_me_d == true)
    {
        // сетевые настройки (на приём)
        str_ip_me  =  ui->label_u_ip->text();
        str_port_me = ui->lE_u_port->text();

        int_port_me = str_port_me.toInt(); // превращаем в инты

        //то отправляем по локальному хосту
        if ( str_ip_me.isEmpty()  == true )
        {
             m_pudp_in->bind(QHostAddress::LocalHost, int_port_me);
        }
        else
        {
             m_pudp_in->bind(QHostAddress(str_ip_me), int_port_me);
        }
        // имена для проверки
        str_ip_me_old = str_ip_me;
        str_port_me_old =str_port_me;
        //делаем конект
        connect(m_pudp_in, SIGNAL(readyRead()), SLOT(slotProcessDatagrams()));
        // датчик
        ip_me_d = false;
    }
    // тут сравниваем строку если сторока отличается от строки то биндимся заного на новых правах
    if(ip_me_d == false)
    {
        // проверка на именения
        str_ip_me  =  ui->label_u_ip->text();
        str_port_me = ui->lE_u_port->text();

        // если строки равны, x должен вернуть 0
        int ip_me_verification = QString::compare(str_ip_me, str_ip_me_old, Qt::CaseInsensitive);
        if(ip_me_verification != 0)
        {
            new_m_pudp = true; // айпишник сменился
        }
        int port_me_verification = QString::compare(str_port_me, str_port_me_old, Qt::CaseInsensitive);
        if(port_me_verification != 0)
        {
            new_m_pudp = true; // айпишник сменился
        }
        if(new_m_pudp == true)
        {
            // закрываем старое соединение
            m_pudp_in->close();
            // открываем новое соединение
            // сетевые настройки (на приём)
            str_ip_me  =  ui->label_u_ip->text();
            str_port_me = ui->lE_u_port->text();

            int_port_me = str_port.toInt(); // превращаем в инты

            //то отправляем по локальному хосту
            if ( str_ip_me.isEmpty()  == true )
            {
                 m_pudp_in->bind(QHostAddress::LocalHost, int_port_me);
            }
            else
            {
                 m_pudp_in->bind(QHostAddress(str_ip_me), int_port_me);
            }
            // имена для проверки
            str_ip_me_old = str_ip_me;
            str_port_me_old =str_port_me;
            // датчики настраиваем
            new_m_pudp = false;
  

          ip_me_d = false;
            //делаем конект
            connect(m_pudp_in, SIGNAL(readyRead()), SLOT(slotProcessDatagrams()));

        }
    }
}

void MainWindow::slotProcessDatagrams()
{
    QByteArray baDatagram_in;
    do {
        baDatagram_in.resize(m_pudp_in->pendingDatagramSize());
        m_pudp_in->readDatagram(baDatagram_in.data(), baDatagram_in.size());
    } while(m_pudp_in->hasPendingDatagrams());

    QDataStream in(&baDatagram_in, QIODevice::ReadOnly);
    in.setVersion(QDataStream::Qt_5_3);
    QString str_priem;
    in >>  str_priem;

    qDebug() << "str_priem: " << str_priem;
    str_priem.clear();

}

Но почему ошибка и откуда она берется

введите сюда описание изображения

Ответы

▲ 0Принят

Возможно надо было подключить

#include <QtNetwork>

раньше заголовочный был без

#include <QtNetwork>

теперь выглядит так

#include <QMainWindow>
#include "qcustomplot.h"
#include <QtNetwork>
#include <QHostInfo>
#include <QNetworkInterface>
#include <QUdpSocket>
#include <QAbstractSocket>
#include <QHostAddress>
#include <QTime>
#include <QTimer>
#include <QVector>

#include <QtMath>

Правда данные пока он особо не передаёт ж_Ж

так и не понял почему приходят пустые сообщения :

str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""
str_priem:  ""