2012-04-09 99 views
0

作为我们项目的一部分,我们需要决定如何使用数据报包中的套接字发送结构。为了做到这一点,我们不会假设通过任何第三方库使用任何序列化。从我所想到的是将结构字段编码到缓冲区中。将消息格式编码到缓冲区以通过UDP套接字发送?

例如。

struct message { 
    int sequence_number; 
    string datamessage; 
} 

现在送这个结构,我们将编码这这将是这样的

/S “sizeofmessage”/我 “sequence_number”/数据 “datamessage”

缓冲区

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

回答

0

只要格式包含足够的信息以供接收端重建struct message,您就可以以任何方式序列化数据。

我不找你提出的格式非常明确:

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

我不知道你的意思是对于那些引号是在消息中逐字,我不知道你的意思消息的大小和序列号应该用ASCII或其他的方式编码为十进制字符串。

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

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

这里的东西很简单,将工作你的情况:

  • 发送的序列号。例如:
    • 作为网络字节顺序(大端)的4字节整数。
    • 与数字的十进制数的ASCII码发送,终止了与您所选择的非数字字符,如' '(空间)
    • (或其他任何明确地解码)
  • 发送字符串作为字节序列。

由于您使用的是UDP(数据报套接字),您不需要发送字符串的长度或以任何特殊字符终止它。接收机将知道在序列号被解码之后的所有剩余字节构成字符串。

只要您的邮件都适合单个UDP数据包(即,它们不大于大约64KB)。

+0

谢谢!这是非常有用的。我明白你的意思,我们的协议有两种类型的消息数据消息和控制消息。根据我所理解的,我应该将消息的序列号与消息的一部分字符串分开发送吗? 如果持有序列号的数据报未传递或延迟,以致于在此之前传递字符串,该怎么办?我很困惑这个想法。 – 2012-04-10 14:07:29

+0

不,我的意思是建议序列号和字符串应该在同一个UDP数据报中串联在一起。对不起,暗示否则。现在,如果你有两种不同类型的消息,那么(1)每一条消息都应该从一个鉴别器开始,它允许接收器把它们分开,这可能只是消息开始时的单个字节,或(2)数据和控制消息应发送到不同的UDP端口。 – Celada 2012-04-10 15:09:48

相关问题