C-如何确定JSON消息的字节数
我正在从事一个基于Linux的项目,该项目由一个用C编写的“核心”应用程序和一个可能用Python编写的web服务器组成。核心服务器和web服务器必须能够通过TCP/IP相互通信。我的重点是C语言中的核心应用程序 由于核心服务器和web服务器使用不同的编程语言,我正在寻找一种易于在两种语言中使用的消息协议。目前我认为JSON是一个很好的候选者。然而,我的问题不是关于消息协议,而是关于如何确定从套接字读取(可能发送到)的字节数,特别是在使用JSON或XML等消息协议时 据我所知,无论您使用JSON、XML还是其他消息协议,都不能在消息本身中包含消息的大小,因为为了解析消息,您需要整个消息,因此需要提前知道消息的大小。请注意,“消息”是指根据使用的消息协议格式化的数据 我一直在思考和阅读解决方案,并得出以下两种可能性:C-如何确定JSON消息的字节数,c,json,sockets,tcp,C,Json,Sockets,Tcp,我正在从事一个基于Linux的项目,该项目由一个用C编写的“核心”应用程序和一个可能用Python编写的web服务器组成。核心服务器和web服务器必须能够通过TCP/IP相互通信。我的重点是C语言中的核心应用程序 由于核心服务器和web服务器使用不同的编程语言,我正在寻找一种易于在两种语言中使用的消息协议。目前我认为JSON是一个很好的候选者。然而,我的问题不是关于消息协议,而是关于如何确定从套接字读取(可能发送到)的字节数,特别是在使用JSON或XML等消息协议时 据我所知,无论您使用JSON
问候。这是流遇到的一个经典问题,包括TCP流,通常称为“消息边界问题”。您可以搜索比我在这里给出的更详细的答案 要确定边界,您有一些选项:
- 就像你说的,用填充物固定长度。除非你有非常小的信息,否则不要建议李>
- 像你说的那样,用尺寸做准备。如果您想在不浪费太多字节的情况下获得对大型消息的支持,可以使用可变长度的数量,在该数量中,您可以使用一个位来确定是否要读取更多字节的大小@alnitak在我忽略的评论中提到了一个缺点,那就是在知道大小之前你不能开始发送
- 绑定到其他地方不使用的字节(JSON和XML仅为文本,因此“\0”可用于ASCII或任何UTF)。简单但在接收端速度较慢,因为您必须以这种方式扫描每个字节
- 编辑:JSON、XML和许多其他格式也可以动态解析以确定边界(例如,每个
必须用JSON中的{
关闭),但我认为这样做没有任何好处}
编辑:我最初说,尽管有TCP协议,但必须包含一个校验和来处理数据包丢失,这是完全错误的。。。在正确接收这些数据包之前,TCP不会前进,所以这不是问题。IDK我在想什么。这是流遇到的一个经典问题,包括TCP流,通常被称为“消息边界问题”。你可以搜索比我在这里给出的更详细的答案 要确定边界,您有一些选项:
- 就像你说的,用填充物固定长度。除非你有非常小的信息,否则不要建议李>
- 像你说的那样,用尺寸做准备。如果您想在不浪费太多字节的情况下获得对大型消息的支持,可以使用可变长度的数量,在该数量中,您可以使用一个位来确定是否要读取更多字节的大小@alnitak在我忽略的评论中提到了一个缺点,那就是在知道大小之前你不能开始发送
- 绑定到其他地方不使用的字节(JSON和XML仅为文本,因此“\0”可用于ASCII或任何UTF)。简单但在接收端速度较慢,因为您必须以这种方式扫描每个字节
- 编辑:JSON、XML和许多其他格式也可以动态解析以确定边界(例如,每个
必须用JSON中的{
关闭),但我认为这样做没有任何好处}
编辑:我最初说,尽管有TCP协议,但必须包含一个校验和来处理数据包丢失,这是完全错误的。。。在正确接收这些数据包之前,TCP不会前进,所以这不是问题。我知道我在想什么。欢迎来到SO。您必须知道,对于TCP/IP,您不能依赖于只接收一条消息。由于连接是一个流,您可能会收到少于一条或多条消息。你必须准备阅读一个部分,然后等待其余部分被接收。实际上,你需要一个高级协议来收集完整的JSON消息。但由于JSON是面向文本的,您也可以使用特殊的非ascii字节作为消息分隔符,因为它们不能包含在JSON消息中,如果您允许的话,可以使用非Unicode。如果要选择文本编码,最好使用utf-8。@Gerhardh:谢谢。我所说的消息是指作为程序员,我指定为消息的内容。假设此消息大小为X字节。那么,您是否以阻塞方式从套接字读取X字节,因此