C# TCP 数据包结构

C# TCP packet structure

本文关键字:结构 数据包 TCP      更新时间:2023-10-16

我正在使用C++编码的服务器在C#中开发聊天应用程序,我已经可以在客户端之间发送和接收消息。但是,我现在的问题是,我想自己定义TCP数据包的结构,例如:

[序列数: uint16_t] [

编号: uint16_t] [数据: x]哪里:

  1. numberOfsequence:是我的数据包的编号(以保证在
    按顺序接收数据包,我知道这是自动接收的TCP协议,但我也想这样做(
  2. id:表示类型
    操作(登录、消息、断开连接(ID 将像 0000登录 , 0001 为消息....
  3. 数据:信息。

          //TO connect
            TcpClient clientSocket; 
            NetworkStream serverStream;
            clientSocket.Connect(IPAddress.Parse(textBoxIP.Text), Convert.ToInt32(textBoxPort.Text));
            serverStream = clientSocket.GetStream();
    
            //Sending login
            byte[] outStream = System.Text.Encoding.ASCII.GetBytes(textBoxLogin.Text);  
            serverStream.Write(outStream, 0, outStream.Length);
            serverStream.Flush();
    

所以我的问题是如何定义数据包结构? 谢谢

您应该在数据包结构中包含data字段的长度。这是因为TCP不处理数据包,而是处理流。底层协议可能会对您的数据包进行切片或组合,然后您必须自行处理和更正。

因此,如果我们假设numberOfSequenceid字段是固定长度的,但data字段的长度可能会有所不同,这是我建议的数据包结构:

numberOfSequence: 2 bytes
id: 2 bytes
dlength: 2 bytes
data: dlength bytes

如您所见,dlength字段指示数据部分的长度。接收端应在读取data字段之前解析dlength信息。如果收到的"数据包"包含的字节数多于dlength字段指示的字节数,则溢出的字节实际上是下一个数据包的一部分。如果dlength值大于接收的数据,则必须等到发送方将其余数据写入流。