Russian Qt Forum

Qt => Работа с сетью => Тема начата: SektorCT от Январь 07, 2023, 19:31



Название: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: SektorCT от Январь 07, 2023, 19:31
Всем привет.
Столкнулся с такой проблемой, если сервер и клиент, сервер запускаю и подключаю клиента.
Сообщения и состояние совета дает выпис QAbstractSocket::ConnectedState
Но вот реакцию на сигнал QTcpSocket::readyRead не могу получить. То есть со стороны приента я пытаюсь послать что-то серверу и метод с отправкой вызывается, но у сервера реакции никакой.

Дайте пожалуйста какой то совет куда стоит копать для поискать проблемы?
Самое интересное что сигнал QTcpSocket::disconnected при отключении клиента срабатывает.
Больше суток копаюсь с этим(


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: Mikhail от Январь 08, 2023, 11:04
Приведи минимальный пример как не работает.


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: SektorCT от Январь 08, 2023, 21:31
Проблема решена, как оказалось со стороны отправителя не правильно формировались данные.
Из за этого размер данных был 0.
Из за этого ничего не уходило на сервер.


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: SektorCT от Январь 12, 2023, 23:12
Как оказалось проблема не решилась.
Я попытался отправить на сервер для теста просто строку с текстом, это сработало.
Но мне надо отправлять пакет такого вида ""header""message.size""message""
И вот это я уже не могу послать. Ниже часть кода которая отправляет пакет
Код:
    if(m_pBuffNetworkWrite->getSize() > 32)
    {
        uint8_t size = m_pBuffNetworkWrite->getSize();

        auto buffToServer = m_pBuffNetworkWrite->popUp(size);

        auto countSendData = m_pSocket->write(reinterpret_cast<const char *>(buffToServer));

        if (countSendData > 0)
        {
            qDebug() << "data sent to server";
        }
        else
        {
            qDebug() << "data not sent to server";
        }
    }

А это сам метод pop который должен отдать пакет
Код:
uint8_t* BuffNetworkWrite::popUp(int size)
{
    QMutexLocker locker(&m_mutex);

    if (m_iSize < size)
    {
        return nullptr;
    }

    auto* pTmp = new uint8_t(size);

    memset(pTmp, 0, size);
    memcpy(pTmp, m_pData, size);

    memcpy(m_pData, m_pData + size, m_iSize - size);
    m_iSize = size;

    return pTmp;
}

Может кто посоветовать в каком направлении искать проблему?
Спасибо


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: SektorCT от Январь 16, 2023, 21:41
Вопрос закрыт. Оказывается(не знал раньше) метод write с одним аргументом это для простого сообщения, а вот с 2 аргументами это уже для пакетов(мой случай). Так что я добавил второй аргумент и сервер принял сообщение.


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: kambala от Январь 17, 2023, 12:58
да, write с одним параметром const char * ожидает си-строку (нуль-терминированную последовательность символов), об этом сказано в документации


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: __Heaven__ от Январь 17, 2023, 17:09
На будущее, может пригодится. netcat прога есть, она позволяет подключиться к сокету понапосылать в него сообщения. Также она может слушать порт, чтобы к ней уже подключались. Оч советую попробовать
Код:
nc -l 4123 # для слушания порта 4123
nc 0.0.0.0 4123 # для подключения к порту 4123 на ip 0.0.0.0
Также можно через пайп посылать содержимое файлов (пакетов)
Код:
{ cat myfile.txt; sleep 1 } | nc 0.0.0.0 4123


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: SektorCT от Январь 28, 2023, 17:54
Также можно через пайп посылать содержимое файлов (пакетов)
Код:
{ cat myfile.txt; sleep 1 } | nc 0.0.0.0 4123

Спасибо за совет, про данную прогу не знал. Единственное не совсем понимаю из вашего примера как из файла он берет данные и посылает. Или я не так записываю строку.


Название: Re: TcpSocket в состоянии подключения но сообщения не приходят
Отправлено: __Heaven__ от Январь 28, 2023, 23:48
В моём примере cat читает всё содержимое в консоль (stdout), пайп | перенаправляет stdout в stdin проги nc
sleep тут ради того, чтобы nc не завершился раньше, чем данные придут к принимающий стороне