2014-10-29 39 views
0

缓冲器的长度我有一个服务器发送多维字符数组如何确定在客户端

char buff1[][3] = { {0xff,0xfd,0x18} , {0xff,0xfd,0x1e} , {0xff,0xfd,21} } 

在这种情况下,携带BUFF1 3个消息(每个具有3个字符)。在服务器端可能会有多个缓冲区实例,其中包含可变长度的消息(注意:每个消息总是有3个字符)。即

char buff2[][3] = { {0xff,0xfd,0x20},{0xff,0xfd,0x27}} 

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

+1

你不能(你可以改变你的协议来决定发送内容之前的大小)。你有没有考虑使用像[JSON](http://json.org/)这样的文本协议? – 2014-10-29 20:38:32

+2

您必须在阵列之前通过网络发送大小。或者你可以添加一个终止序列。 – Galik 2014-10-29 20:39:41

回答

2

服务器应该将有关消息长度(以及任何其他结构)的信息作为消息的一部分与消息一起发送。

一个简单的方法是先发送消息中的字节数,然后发送消息中的字节数。通常你也想发送协议版本(所以你可以检测不匹配),甚至可以发送消息ID头(这样你就可以发送多种消息)。

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

或者,您可以发送一些符号表明序列已终止。如果有一个值永远不是有效的序列元素(如0,0,0),则可以发送该值以表示“不再有数据”。或者你可以发送每个元素的头部,说明它是否是最后一个元素,或者头部可以说这个元素不存在,最后一个元素是前一个元素。

+0

我应该如何使用C++来解决这个问题 – Jonsnow29 2014-10-29 20:52:32

+0

正如Galik在另一条评论中提到的那样,根据您的要求,为您发送的数据添加终止序列或“特殊消息”是另一个可行的解决方案。在客户端,您会读取消息,直到您阅读'特殊消息'{0x00,0x00,0x00}。那么你知道没有更多的数据可以预料。当然,这只有在100%确定{0x00,0x00,0x00}不会是有效的消息时才有效。补充一点,你解决这个问题的方式并不取决于你选择的编程语言。 – Julian 2014-10-29 21:08:15

+0

@ Jonsnow29这将取决于你如何发送数据的第一个地方? – Yakk 2014-10-29 21:23:53