使用QTcpSocket持续快速使用

时间:2017-06-21 12:37:24

标签: c++ qt sockets qtcpsocket

我需要实现一个以300 Hz(每秒300个样本)读取数据的客户端。使用C套接字时,一切都可以接受,因为我需要运行一个连续的while循环来从服务器获取数据(阻止客户端处理其他任何事情)。 所以,我决定尝试转移到QTcpsocket,以便处理来自其他对象到客户端对象的信号。但是当我连接Qtcpsocket时,连接信号进行读取

connect(socket,&QTcpSocket::readyRead, this, &client::handleReadyRead, Qt::ConnectionType::QueuedConnection);

这是我的经纪人 -

QByteArray b = socket->read(12);
int packetLength = (unsigned char)b[6] << CHAR_BIT;
packetLength |=  (unsigned char)b[7];
b = socket->read(packetLength);

(每个数据包都有一个12字节长的标头) 现在我得到一个非常慢的客户端 - 它每秒处理大约3个样本......我已经检查了bytesavailable()返回了多少,看起来数据堆积在套接字缓冲区中。 我究竟做错了什么?我必须得到一个非常快的客户端,但我不确定我正在阅读的方式是最佳的。 有没有更有效的方法呢?

谢谢

1 个答案:

答案 0 :(得分:1)

您当前的handleReadyRead假定可以读取完整的数据包并保留数​​据包边界。 TCP无法正常工作 - 它只是一个字节流。

更好的方法可能是将数据累积到QByteArray,并在QByteArray可用的时候从client读取数据包。

因此,假设您的QByteArray m_data; 类有数据成员......

void handleReadyRead ()
{

  /*
   * Append all available data to m_data.
   */
  m_data.append(socket->readAll());

  /*
   * Now work our way through m_data processing complete
   * packets as we find them.  At any given point offset
   * is the total size of all complete packets (including
   * headers) processed thus far.
   */
  int offset = 0;
  while (m_data.length() >= offset + 12) {

    /*
     * We have enough data for a header so read the packet length.
     */
    int packetLength  = (unsigned char)m_data[offset + 6] << CHAR_BIT;
    packetLength     |= (unsigned char)m_data[offset + 7];

    /*
     * Check to see if we have sufficient data for the packet
     * body.  If not then we're done for the time being.
     */
    if (m_data.length() < offset + 12 + packetLength)
      break;

    /*
     * There is enough data for the complete packet so read it.
     * Note that the following will include the header data in the
     * packet variable.  If that's not desired then change it to...
     *
     *   auto packet = m_data.mid(offset + 12, packetLength);
     */
    auto packet = m_data.mid(offset, 12 + packetLength);

    /*
     * Do whatever you want with the packet.
     */
    do_something_with_the_packet(packet);

    /*
     * Update the offset according to the amount of data read.
     */
    offset += 12 + packetLength;
  }

  /*
   * Finally, remove the data processed from the beginning of
   * the QByteArray.
   */
  if (offset)
    m_data = m_data.right(data.size() - offset);
}

我希望逻辑可以像......

String userName = ""+(int)(Math.random()*Integer.MAX_VALUE);
String emailID = "User"+userName+"@example.com";

以上是未经测试的,但肯定是我过去使用过的代码。