C++ 如何确定客户端缓冲区的长度

C++ 如何确定客户端缓冲区的长度,c++,linux,sockets,C++,Linux,Sockets,我让服务器发送多维字符数组 char buff1[][3] = { {0xff,0xfd,0x18} , {0xff,0xfd,0x1e} , {0xff,0xfd,21} } 在这种情况下,buff1携带3条消息(每条消息有3个字符)。服务器端可能有多个缓冲区实例,其中包含可变长度的消息(注意:每条消息始终有3个字符)。即 编译代码时,应如何在客户端存储这些缓冲区的大小。服务器应发送消息长度(以及任何其他结构)的信息,并将消息作为消息的一部分 一个简单的方法是首先发送消息中的字节数,然后发送

我让服务器发送多维字符数组

char buff1[][3] = { {0xff,0xfd,0x18} , {0xff,0xfd,0x1e} , {0xff,0xfd,21} }
在这种情况下,buff1携带3条消息(每条消息有3个字符)。服务器端可能有多个缓冲区实例,其中包含可变长度的消息(注意:每条消息始终有3个字符)。即


编译代码时,应如何在客户端存储这些缓冲区的大小。

服务器应发送消息长度(以及任何其他结构)的信息,并将消息作为消息的一部分

一个简单的方法是首先发送消息中的字节数,然后发送消息中的字节数。通常,您还希望发送协议的版本(以便可以检测不匹配),甚至可能发送消息id头(以便可以发送多种消息)

如果目标不是极快的性能(并且您正在通过网络接口进行讨论,网络接口往往比计算机慢:解析可能足够便宜,您不必在意),那么使用更高级别的协议或格式有时是个好主意(json、xml等)。这也有助于解决调试问题,因为您不用调试自定义协议,而是调试更高级别的格式


或者,您可以发送一些序列已终止的符号。如果有一个值从来都不是有效的序列元素(例如
0,0,0
),您可以将其发送到表示“不再有数据”的位置。或者,您可以在发送每个元素时附带一个标题,说明它是否是最后一个元素,或者标题可以说明此元素不存在,而最后一个元素是前一个元素。

您不能这样做(您可以更改协议以决定在发送内容之前发送大小)。你是否考虑过使用类似的文本协议?你必须在数组之前通过网络发送大小。正如Galik在另一篇评论中提到的,向发送的数据添加终止序列或“特殊消息”是另一种可行的解决方案,具体取决于您的需求。在客户端,您将一直读取消息,直到读取“特殊消息”{0x00,0x00,0x00}。那么您就知道不需要更多的数据了。当然,只有当您100%确定{0x00,0x00,0x00}不是有效消息时,这才有效。另外,处理此问题的方式并不取决于您选择的编程语言。@Jonsnow29这将取决于您首先如何发送数据?@AtlasC1我认为额外的一段涵盖了终止序列选项,您认为如何?
char buff2[][3] = { {0xff,0xfd,0x20},{0xff,0xfd,0x27}}