C - 如何确定JSON消息的字节数

时间:2018-05-14 08:10:23

标签: c json sockets tcp

我正在开发一个基于Linux的项目,该项目包含一个用C语言编写的“核心”应用程序和一个可能用Python编写的Web服务器。核心和Web服务器必须能够通过TCP / IP相互通信。我的重点是C中的核心应用程序。

由于核心和Web服务器使用不同的编程语言,我正在寻找一种易于在两种语言中使用的消息协议。目前我认为JSON是一个很好的候选人。然而,我的问题不在于消息协议,而在于如何确定从套接字读取(并可能发送到)套接字的字节数,特别是在使用JSON或XML等消息协议时。 p>

据我所知,无论您使用的是JSON,XML还是其他一些消息协议,都不能在消息本身中包含消息的大小,因为为了解析消息,您需要整个消息,因此需要提前知道它的大小。请注意,“message”是指根据使用的消息协议格式化的数据。

我一直在思考并阅读有关解决方案的问题,并提出了以下两种可能性:

  1. 确定消息的最大可能大小,比如500字节,并根据它确定缓冲区大小,比如512字节,并为每条消息添加填充,以便发送512字节;
  2. 在“纯文本”中添加其大小的每个邮件。如果大小存储在Int(4个字节)中,则接收器首先从套接字读取4个字节并使用这4个字节确定实际消息的下一个读取字节数;
  3. 因为我读过的所有提供的解决方案都不是专门用于某些消息协议的,比如JSON,我认为可能是因为我错过了某些东西。

    那么,我提供的两种可能性中哪一种是最好的,或者,我不知道这个问题的其他一些解决方案?

    亲切的问候。

1 个答案:

答案 0 :(得分:2)

这是流遇到的典型问题,包括TCP的流,通常称为"消息边界问题。"您可以搜索更详细的答案,而不是我在这里给出的答案。

要确定边界,您有一些选择:

  • 像你说的那样用填充固定长度。除非你有非常小的消息,否则不建议。
  • 像你说的那样大小的前置。如果您希望获得花哨并支持大型消息而不浪费太多字节,则可以使用可变长度数量,其中您使用一个位来确定是否为该大小读取更多字节。 @alnitak在我忽略的评论中提到了一个缺点,即在你知道尺寸之前你不能开始发送。
  • 绑定某些字节,您不能在其他任何地方使用(JSON和XML仅限文本,因此' \ 0'适用于ASCII或任何UTF)。接收端简单但速度较慢,因为您必须以这种方式扫描每个字节。
  • 编辑:JSON,XML和许多其他格式也可以即时解析以确定边界(例如,每个{必须在JSON中用}关闭),但我不是&# 39;看到这样做有什么好处。

如果这不是一次学习经历,您可以使用现有协议为您完成所有这些操作。例如,HTTP(低效)或gRPC(更高效)。

编辑:我最初说过必须包含一个校验和来处理数据包丢失,而不管TCP是什么......在这些数据包被正确接收之前TCP不会前进,因此不是问题。 IDK我在想什么。