Цитата(Oleg_IT @ Nov 8 2016, 12:48)

...
Фрагмент кода приёмника
Код
void MainWindow::slotReadyRead()
{
if (m_pTcpSocket == NULL || m_pTcpSocket->isOpen() == false)
return;
slotSendToServer();
QByteArray dAll;
dAll.clear();
dAll = m_pTcpSocket->readAll();
SizeAll = dAll.count();
if (AddData(dAll.data(),SizeAll,(uint8_t*)m_Data.Data) == true)
WidgetMain->DrawGr();
}
...
Подкорректируйте меня если я обшибаюсь...
Вы очищаете массив(закос под кути или порт кутишный).
Считываете всё что пришло в ку-байт-эррэй.
получаете кол-во принятых байт.
и далее передаёте на обработку....
Т.е. для этого кода, будет ликвиден и один байт, и два, и 100, и килобайт.
Т.е. если например произошёл затор в сети, и ваши данные на IP уровне безбожно режутся хопами, вы можете получить очень и очень разные и замысловатые длины полезных данных.
Представляйте себе трубу.
С одной стороны в которую заливают данные, с другой вы эти данные последовательно выгребаете.
Но если Вам нужна квантованность - то увы и ах, это Ваша личная забота. И то что Вы будете получать в одном тихом локальном сегменте сети апсолютно не даст гарантии того, что при ударной нагрузке либо потерях
в сети Ваш код будет устойчиво работать.
Обратите внимание на реализацию приёмников в грамотных кодах серваков - там кол-во байт которое необходимо принять передаётся в подпрограмму приёма. И подпрограмма действует по
принципу либо всё либо ошибка.
Длины данных обычно передают в хедере фиксированной длины. т.е.
Ваш приёмник (как один из вариантов) должен быть реализован как приём фиксированной длины хедера, далее взятие из этого хедера длины данных, подготовка приёмного буффера,
и собственно приём данных пришедшей из хидера.
удачи вам
(круглый)
ЗЫ
Есть ещё настройки TCP уровня по задержке перед передачей, но там задержки(по дефолту - не более нескольких мс). Т.е. если у Вас глюкало на секунды-минуты - это явно хромает консерватория...
ЗЫ ЗЫ
Ваш код приёмника (я сначала подумал что под армом пишете, но от этого рояль не меняется) может быть типа такого
Код
void CTcpClient::_slotAnswera()
{
if (m_baHeader.size() == 0)
{
if (m_pTcpSocket->bytesAvailable() < sizeof(HRBusinessLogic::Tools::SDataHeader))
return;
//
m_baHeader = m_pTcpSocket->read(sizeof(HRBusinessLogic::Tools::SDataHeader));
}
//
const HRBusinessLogic::Tools::SDataHeader* pReceiveData = reinterpret_cast<const HRBusinessLogic::Tools::SDataHeader*>(m_baHeader.constData());
//
if (m_pTcpSocket->bytesAvailable() < pReceiveData->m_unSize)
return;
//
QByteArray data = m_pTcpSocket->read(pReceiveData->m_unSize);
data.push_front(m_baHeader);
m_baHeader.clear();
emit eventProcessingData(data);
}
Сообщение отредактировал kolobok0 - Nov 8 2016, 19:50