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

[numberOfsequence:uint16_t] [id:uint16_t] [data:x]
在哪里:

  • numberOfsequence:是我的数据包的编号(以确保
    按顺序接收数据包,我知道这是由自动控制的
    TCP协议(protocol),但我也想这样做)
  • id:代表类型
    操作(登录,消息,断开连接)的ID类似于0000
    登录,0001为消息...。
  • 数据:信息。
          //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不处理数据包而是处理流。基础协议(protocol)可能会切片或合并您的数据包,然后您必须处理并更正自己。

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

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

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

    关于c# - C#TCP数据包结构,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42054164/

    10-13 09:09
    查看更多