Russian Qt Forum
Ноябрь 22, 2024, 11:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: TcpSocket в состоянии подключения но сообщения не приходят  (Прочитано 4502 раз)
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« : Январь 07, 2023, 19:31 »

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

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

Сообщений: 587


Просмотр профиля
« Ответ #1 : Январь 08, 2023, 11:04 »

Приведи минимальный пример как не работает.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #2 : Январь 08, 2023, 21:31 »

Проблема решена, как оказалось со стороны отправителя не правильно формировались данные.
Из за этого размер данных был 0.
Из за этого ничего не уходило на сервер.
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #3 : Январь 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;
}

Может кто посоветовать в каком направлении искать проблему?
Спасибо
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #4 : Январь 16, 2023, 21:41 »

Вопрос закрыт. Оказывается(не знал раньше) метод write с одним аргументом это для простого сообщения, а вот с 2 аргументами это уже для пакетов(мой случай). Так что я добавил второй аргумент и сервер принял сообщение.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #5 : Январь 17, 2023, 12:58 »

да, write с одним параметром const char * ожидает си-строку (нуль-терминированную последовательность символов), об этом сказано в документации
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #6 : Январь 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
Записан
SektorCT
Частый гость
***
Offline Offline

Сообщений: 229


Просмотр профиля
« Ответ #7 : Январь 28, 2023, 17:54 »

Также можно через пайп посылать содержимое файлов (пакетов)
Код:
{ cat myfile.txt; sleep 1 } | nc 0.0.0.0 4123

Спасибо за совет, про данную прогу не знал. Единственное не совсем понимаю из вашего примера как из файла он берет данные и посылает. Или я не так записываю строку.
Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #8 : Январь 28, 2023, 23:48 »

В моём примере cat читает всё содержимое в консоль (stdout), пайп | перенаправляет stdout в stdin проги nc
sleep тут ради того, чтобы nc не завершился раньше, чем данные придут к принимающий стороне
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 22.