Tcp-пакеты с использованием QTcpSocket

Я знаю, что TCP гарантирует, что все пакеты поступят. Но может ли пакет быть разделен на 2 или более? Я использую Qt с classом QTcpSocket, и я хочу знать, ReadyRead() сигнал ReadyRead() испускается только при получении полного пакета. Или, другими словами, есть ли смысл отправлять размер пакета в первые байты, а затем ждать в цикле до тех пор, пока не будут получены все байты? Или я могу просто вызвать socket->readAll() и я должен получить один полный пакет?

Если отправляется большое количество данных, пакет может поступать в отдельные части. В качестве альтернативы, несколько сообщений могут быть приняты в одном слоте readyRead.

Это хорошая практика, чтобы контролировать это, установив первый байт (ы) на число байтов, которые будут отправлены. Затем в readyRead вы читаете первые байты и добавляете данные в буфер до тех пор, пока ожидаемый объем данных не будет получен.

При получении данных это также означает, что если несколько сообщений принимаются в одном вызове readyRead (), вы можете узнать, где заканчивается первое сообщение, и начинается следующее.

Вот пример клиента, который получает данные в функции readyRead ()

 void MyClass::readyRead() { // m_pConnection is a QTcpSocket while(m_pConnection->bytesAvailable()) { QByteArray buffer; int dataSize; m_pConnection->read((char*)&dataSize, sizeof(int)); buffer = m_pConnection->read(dataSize); while(buffer.size() < dataSize) // only part of the message has been received { m_pConnection->waitForReadyRead(); // alternatively, store the buffer and wait for the next readyRead() buffer.append(m_pConnection->read(dataSize - buffer.size())); // append the remaining bytes of the message } QString msg(buffer); // data in this case is JSON, so we can use a QString emit Log(QString("\tMessage Received: %1").arg(msg)); // Do something with the message ProcessMessage(msg); } } в void MyClass::readyRead() { // m_pConnection is a QTcpSocket while(m_pConnection->bytesAvailable()) { QByteArray buffer; int dataSize; m_pConnection->read((char*)&dataSize, sizeof(int)); buffer = m_pConnection->read(dataSize); while(buffer.size() < dataSize) // only part of the message has been received { m_pConnection->waitForReadyRead(); // alternatively, store the buffer and wait for the next readyRead() buffer.append(m_pConnection->read(dataSize - buffer.size())); // append the remaining bytes of the message } QString msg(buffer); // data in this case is JSON, so we can use a QString emit Log(QString("\tMessage Received: %1").arg(msg)); // Do something with the message ProcessMessage(msg); } } 
  • Изменяется ли порт, когда TCP-соединение принимается сервером?
  • как получить файл передачи между клиентом и сервером с помощью java socket
  • Какова цель портов?
  • Возможно ли, чтобы ПК одновременно использовал два сетевых соединения?
  • Как обнаружить ближайший боковой разъем?
  • Как пакеты IP-ответа достигают своего адресата внутри частной локальной сети?
  • В C #, как проверить, доступен ли TCP-порт?
  • Каков максимальный номер сетевого порта TCP / IP, допустимый для IPv4?
  • Минимальный размер части данных сегмента TCP
  • Кто слушает данный порт TCP на Mac OS X?
  • Двойной маршрутизатор OpenVpn Port Forwarding
  • Давайте будем гением компьютера.