Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.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#如何处理TCP数据包/数据段_C#_Networking_Tcp_Packet - Fatal编程技术网

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

C#如何处理TCP数据包/数据段,c#,networking,tcp,packet,C#,Networking,Tcp,Packet,关于TCP的几个问题 我知道,如果数据包击中MTU较低的网络设备等,它将被“拆分”或碎片化。但我遇到的问题是理解如何在应用程序中“重建”我的有效负载。(我已经试了2-3个小时了,但似乎没能成功) 第一件事。发送数据包时,以下两个选项的优点/缺点是什么 NetworkStream ns = client.GetStream(); ns.Write(BitConverter.GetBytes(100)); ns.Write(BitConverter.GetBytes("Test")); 或 如何在

关于TCP的几个问题

我知道,如果数据包击中MTU较低的网络设备等,它将被“拆分”或碎片化。但我遇到的问题是理解如何在应用程序中“重建”我的有效负载。(我已经试了2-3个小时了,但似乎没能成功)

第一件事。发送数据包时,以下两个选项的优点/缺点是什么

NetworkStream ns = client.GetStream();
ns.Write(BitConverter.GetBytes(100));
ns.Write(BitConverter.GetBytes("Test"));


如何在recv上重建有效载荷。如果它已被拆分,则为部分?我很想用勺子喂它,因为我似乎错过了我当前应用程序中一些非常重要但不太明显的部分。

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

您必须记住,它是一个TCP“流”,因此您如何读取或写入它并不重要;这只是一个连续的数据流。这取决于您对数据包的定义,以提供通过该流的数据结构

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


所以,在你的两个例子中,这并不重要。选择最简单的方法(在本例中是第一种方法)。

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

您必须记住,它是一个TCP“流”,因此您如何读取或写入它并不重要;这只是一个连续的数据流。这取决于您对数据包的定义,以提供通过该流的数据结构

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


所以,在你的两个例子中,这并不重要。选择最简单的方法(在本例中为第一种方法)。

目前我的有效负载结构是;OP code,size,data但是如果我已经理解了书中关于TCP的章节,我可能会体验到我得到了OP code,size,DataSplit[0],在下一次阅读中我得到了DataSplit[1],OP code,size,DataSure,但是你想得太多了。如果你按照我上面的指示去做,你就会知道到底要读多少字节。数据是如何输入的根本不重要。记住,这是一个数据流;OP code,size,data但是如果我已经理解了书中关于TCP的章节,我可能会体验到我得到了OP code,size,DataSplit[0],在下一次阅读中我得到了DataSplit[1],OP code,size,DataSure,但是你想得太多了。如果你按照我上面的指示去做,你就会知道到底要读多少字节。数据是如何输入的根本不重要。记住,这是一个数据流。
NetworkStream ns = client.GetStream();
byte[] payload = BitConverter.GetBytes(100).Concat(BitConverter.GetBytes("Test"));
ns.Write(payload); //, 0, payload.Length);