Сформированный пакет клиент не может отправить серверу по tcp

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

Всем привет. Столкнулся с проблемой отправки сформированного пакета от клиента серверу. Нашел старый вопрос где комментатор расписал по сути то что я и делаю. Сообщение от клиента серверу

У клиента я формирую пакет такого вида ""header""message.size""message"" Соединение установлено, но клиент ничего не отправляет. Ниже 2 метода, один проверка и отправка а второй(из буфера) отдает для отправки сам пакет

void MyClient::sendToServer()
{
    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";
    }
}

Этот метод отдает данные которые были уже раньше записаны и размер самого пакета.

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;
}

Буду признателен за советы или указание где стоит искать проблему.

Добавляю метод которым я формирую пакет

uint8_t *PackNetwork::toByte(uint32_t &size)
{
    uint8_t *dataBuffer = new uint8_t[m_packHeader.size]; // буфер размером заголовок + размер сообщения + сообщение
    memcpy(dataBuffer, &m_packHeader, sizeof(packHeader));
    uint8_t *byteData = nullptr;

    uint32_t offset = sizeof(packHeader);

    for (auto &item : m_dataList)
    {
        uint32_t sizeData = 0;

        byteData = item->toByte(sizeData); // после метода sizeData имеет размер сообщения, byteData это сообщение
        memcpy(dataBuffer + offset, byteData, sizeData);

        offset += sizeData;
    }

    size = m_packHeader.size;

    return dataBuffer;
}

Аргумент size при входе в метод 0 а после уже меняется. Если я в методе заменю возвращение пакета то что мне надо дял сервера просто на строку из byteData то сервер реагирует на примем. И само собою у клиенат я вижу сообщение data sent to server

Ответы

▲ 0

Вопрос закрыт. Как оказалось метод write с одним аргументом это для простых сообщений, на подобии слова. А с двумя аргументами это уже для пакетов. Я попробовал второй вариант и сервер принял пакет.