C#如何处理TCP数据包/段

hay*_*yer 0 c# networking tcp packet

关于TCP的几个问题.

我知道如果数据包遇到MTU等较低的网络设备,它将被"拆分"或碎片化.但我遇到的问题是了解如何在应用程序中"重建"我的有效负载.(我现在已经尝试了2-3个小时,但似乎无法做到正确)

首先要做的事情.发送数据包时,以下两个选项的优缺点是什么?

NetworkStream ns = client.GetStream();
ns.Write(BitConverter.GetBytes(100));
ns.Write(BitConverter.GetBytes("Test"));
Run Code Online (Sandbox Code Playgroud)

要么

NetworkStream ns = client.GetStream();
byte[] payload = BitConverter.GetBytes(100).Concat(BitConverter.GetBytes("Test"));
ns.Write(payload); //, 0, payload.Length);
Run Code Online (Sandbox Code Playgroud)

我如何在recv重建有效载荷.部分如果已被拆分?我会喜欢用这种勺子喂食,因为我似乎错过了一些非常重要的,但不是那么明显,在我目前的应用中.

Jon*_*art 5

您根本不关心MTU或碎片.操作系统的TCP/IP堆栈负责重新组装碎片数据包.

你必须记住,它是一个TCP" ",所以你如何阅读或写它并不重要; 它只是一个连续的数据流.这取决于为通过该流传递的数据结构提供的数据包定义.

在许多结构化协议中,存在用户定义的头部,第一个字段指定分组的长度.所以你首先读取X字节,其中X是标题的大小.您解释该标头,以便知道数据包的其余部分有多大.然后,您读取适当数量的字节以获取数据包的其余部分.

所以,在你的两个例子中,它并不重要.选择最简单的东西(在这种情况下,第一个.)