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

C-如何确定JSON消息的字节数,c,json,sockets,tcp,C,Json,Sockets,Tcp,我正在从事一个基于Linux的项目,该项目由一个用C编写的“核心”应用程序和一个可能用Python编写的web服务器组成。核心服务器和web服务器必须能够通过TCP/IP相互通信。我的重点是C语言中的核心应用程序 由于核心服务器和web服务器使用不同的编程语言,我正在寻找一种易于在两种语言中使用的消息协议。目前我认为JSON是一个很好的候选者。然而,我的问题不是关于消息协议,而是关于如何确定从套接字读取(可能发送到)的字节数,特别是在使用JSON或XML等消息协议时 据我所知,无论您使用JSON

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

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

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

我一直在思考和阅读解决方案,并得出以下两种可能性:

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

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


    问候。

    这是流遇到的一个经典问题,包括TCP流,通常称为“消息边界问题”。您可以搜索比我在这里给出的更详细的答案

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

    • 就像你说的,用填充物固定长度。除非你有非常小的信息,否则不要建议
    • 像你说的那样,用尺寸做准备。如果您想在不浪费太多字节的情况下获得对大型消息的支持,可以使用可变长度的数量,在该数量中,您可以使用一个位来确定是否要读取更多字节的大小@alnitak在我忽略的评论中提到了一个缺点,那就是在知道大小之前你不能开始发送
    • 绑定到其他地方不使用的字节(JSON和XML仅为文本,因此“\0”可用于ASCII或任何UTF)。简单但在接收端速度较慢,因为您必须以这种方式扫描每个字节
    • 编辑:JSON、XML和许多其他格式也可以动态解析以确定边界(例如,每个
      {
      必须用JSON中的
      }
      关闭),但我认为这样做没有任何好处
    如果这不仅仅是一次学习体验,您可以使用现有的协议来完成这一切。例如,HTTP(低效)或gRPC(更高效)


    编辑:我最初说,尽管有TCP协议,但必须包含一个校验和来处理数据包丢失,这是完全错误的。。。在正确接收这些数据包之前,TCP不会前进,所以这不是问题。IDK我在想什么。

    这是流遇到的一个经典问题,包括TCP流,通常被称为“消息边界问题”。你可以搜索比我在这里给出的更详细的答案

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

    • 就像你说的,用填充物固定长度。除非你有非常小的信息,否则不要建议
    • 像你说的那样,用尺寸做准备。如果您想在不浪费太多字节的情况下获得对大型消息的支持,可以使用可变长度的数量,在该数量中,您可以使用一个位来确定是否要读取更多字节的大小@alnitak在我忽略的评论中提到了一个缺点,那就是在知道大小之前你不能开始发送
    • 绑定到其他地方不使用的字节(JSON和XML仅为文本,因此“\0”可用于ASCII或任何UTF)。简单但在接收端速度较慢,因为您必须以这种方式扫描每个字节
    • 编辑:JSON、XML和许多其他格式也可以动态解析以确定边界(例如,每个
      {
      必须用JSON中的
      }
      关闭),但我认为这样做没有任何好处
    如果这不仅仅是一次学习体验,您可以使用现有的协议来完成这一切。例如,HTTP(低效)或gRPC(更高效)


    编辑:我最初说,尽管有TCP协议,但必须包含一个校验和来处理数据包丢失,这是完全错误的。。。在正确接收这些数据包之前,TCP不会前进,所以这不是问题。我知道我在想什么。

    欢迎来到SO。您必须知道,对于TCP/IP,您不能依赖于只接收一条消息。由于连接是一个流,您可能会收到少于一条或多条消息。你必须准备阅读一个部分,然后等待其余部分被接收。实际上,你需要一个高级协议来收集完整的JSON消息。但由于JSON是面向文本的,您也可以使用特殊的非ascii字节作为消息分隔符,因为它们不能包含在JSON消息中,如果您允许的话,可以使用非Unicode。如果要选择文本编码,最好使用utf-8。@Gerhardh:谢谢。我所说的消息是指作为程序员,我指定为消息的内容。假设此消息大小为X字节。那么,您是否以阻塞方式从套接字读取X字节,因此