了解客户端的优点是服务器发送的包的大小

时间:2009-09-21 02:48:37

标签: c++ qt networking network-programming

我是网络编程的新手,所以我希望这不是一个完整的新手问题 我在Qt-Homepage上阅读了如何构建一个小服务器的教程,我找到了this

QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out << (quint16)0;
out << "..."; // just some text
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
  

在我们的QByteArray开始时,我们为16位整数保留空间,该整数将包含我们发送的数据块的总大小。 [我们继续以随机财富流式传输。]然后我们回到QByteArray的开头,并用数组的总大小覆盖保留的16位整数值。 通过这样做,我们为客户提供了一种方法,可以在读取整个数据包之前验证他们可以预期的数据量。

所以我想知道,这个程序有什么好处?如果你不这样做会发生什么?也许你还可以添加一些例子。

2 个答案:

答案 0 :(得分:2)

这是标准的东西。

对于接收程序,通过网络传输的所有内容都只是一个字节流。除了应用程序对其施加的内容之外,该流没有任何意义,完全相同的方式文件没有超出其应用程序定义其记录,行等的含义。 客户端和服务器可以理解流的唯一方法是建立他们同意的约定或协议。

所以实现这一目标的一些常见方法是:

  • 有一个分隔符,用于指定消息的结尾(例如回车)
  • 传递一个长度字段,如您的示例所示,它告诉接收方有多少数据包含下一条消息。
  • 只是建立一个固定的约定(例如每个消息将是20个字节或类型'A'记录将是一个定义的格式,类型'B'记录另一个...)
  • 根本就没有任何约定就把它当作一个流来对待它(比如把任何来自网络的东西放在一个文件中,而不用关注它是什么)。

长度字节方法的一个优点是接收器知道完全期望的数据量。通过一些额外的健全性检查,这可以帮助消除缓冲区溢出等问题。

答案 1 :(得分:1)

在接收数据包之前了解数据包大小具有性能优势。 然后,您可以从堆或您使用的任何缓冲区管理中精确分配所需的字节数,并通过少量(理想情况下)一次调用“网络接收功能”来接收所有字节。 如果您不知道有利的大小,则必须为消息的一小部分调用“网络接收功能”。

由于'网络接收功能'(可能是recv()或Qt提供给你的任何东西)是一个系统调用,它也会进行TCP缓冲区处理等等,它应该假设为每个呼叫都很慢高架。所以你应该尽可能少地打电话。