Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在二进制网络流中分离消息?_C#_Sockets_Networking_Buffer_Networkstream - Fatal编程技术网

C# 如何在二进制网络流中分离消息?

C# 如何在二进制网络流中分离消息?,c#,sockets,networking,buffer,networkstream,C#,Sockets,Networking,Buffer,Networkstream,我正在使用sockets/networkStream对数据进行编码、发送和解码。但我如何才能有效地将消息彼此分离 例如,当我使用1024字节的缓冲区时,通过networkStream接收内容。然后我想把这个缓冲区传递给我的decoder类,但我不确定下一条消息的一部分是否已经潜伏在缓冲区中。如果我的消息只有50个字节,我怎么知道缓冲区中没有20条消息?或者更糟的是,我的缓冲区中可能有部分消息 假设我的消息有3000字节,缓冲区中会有一条消息和第二条消息的开头吗?或者networkStream是否

我正在使用sockets/networkStream对数据进行编码、发送和解码。但我如何才能有效地将消息彼此分离

例如,当我使用1024字节的缓冲区时,通过networkStream接收内容。然后我想把这个缓冲区传递给我的decoder类,但我不确定下一条消息的一部分是否已经潜伏在缓冲区中。如果我的消息只有50个字节,我怎么知道缓冲区中没有20条消息?或者更糟的是,我的缓冲区中可能有部分消息


假设我的消息有3000字节,缓冲区中会有一条消息和第二条消息的开头吗?或者networkStream是否会在发送邮件时自动接收包中的邮件?

通常有两种选择:

  • 发送一个固定大小的标题,指定以下消息的确切长度
  • 发送消息,后跟无法在消息中显示的终止符

通过套接字发送可变大小二进制数据的所有方法都是这两个主题之一的变体。

发送固定大小的标头。这是显而易见的,但也许值得一提-stating@caesay,不一定。你可以使用一些可变长度的代码(例如埃利亚斯代码中的一个)。有第三个选择:一个自我描述的协议,如XML。每个节点名称都有一个终止字符,所有的东西通常都有某种终止指示符。我不会说XML是应该用来检测消息边界的东西。由于您必须查找根节点的末尾(并且具有与根节点同名的内部节点是有效的),因此这种方法非常复杂。固定标题可能是最简单的方法。您的问题看起来像您的流。大量数据,没有消息终止符。我在你的问题中引入了
\n\n
作为终结符。