C#TCP数据包结构

时间:2017-02-05 16:02:30

标签: c# c++ sockets tcp ip

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

[numberOfsequence:uint16_t] [id:uint16_t] [data:x] 其中:

  1. numberOfsequence:是我的数据包的数量(以保证在 按顺序接收数据包,我知道这是自动调用的 TCP协议,但我也想这样做)
  2. id:代表
    的类型 operartion(登录,消息,断开连接)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();
    
  4. 所以我的问题是如何定义数据包结构?感谢

1 个答案:

答案 0 :(得分:1)

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

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

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

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