0

作为我们项目的一部分,我们需要决定如何在数据报包中使用套接字发送结构。为了做到这一点,我们不应该通过任何第三方库使用任何序列化。我想出的是将结构字段编码到缓冲区中。

例如。

struct message {
   int sequence_number;
   string datamessage;
}

现在要发送这个结构,我们会将它编码到一个类似于这样的缓冲区

/s"sizeofmessage"/i"sequence_number"/data"datamessage"

有没有更好的方法来实现这一点?

4

1 回答 1

0

只要格式包含足够的信息让接收端重建struct message.

我发现您提出的格式不是很清楚:

/s"sizeofmessage"/i"sequence_number"/data"datamessage"

我不知道你的意思是那些引号在消息中确实存在,我不知道你的意思是消息的大小和序列号应该被编码为 ASCII 中的十进制字符串还是其他的东西.

您应该决定您的协议是否需要以允许接收者识别更新的消息格式的方式进行扩展,以防将来添加更多字段。您需要决定是硬编码只处理上面介绍的非常简单结构的东西,还是想要更灵活的东西来处理不同的结构。请记住,您的序列化格式越具有可扩展性和灵活性,您就越容易改变不使用现成序列化库的决定。

但是假设你想保持它非常简单并设计一些只处理这个特定结构的东西。

以下是适用于您的情况的非常简单的方法:

  • 发送序列号。例如:
    • 作为网络字节顺序(大端)的 4 字节整数。
    • 作为带有数字的十进制数,以 ASCII 形式发送,以您选择的非数字字符结尾,例如' '(空格)
    • (或其他任何可以明确解码的东西)
  • 将字符串作为字节序列发送。

因为您使用的是 UDP(数据报套接字),所以您不需要发送字符串的长度或使用任何类型的特殊字符终止它。接收方将知道序列号解码后数据包中的所有剩余字节构成字符串。

只要您的消息都适合单个 UDP 数据包(即它们不大于大约 64 KB),这就会起作用。

于 2012-04-09T22:22:29.667 回答