gpt4 book ai didi

C# TCP数据包结构

转载 作者:可可西里 更新时间:2023-11-01 02:50:45 24 4
gpt4 key购买 nike

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

[numberOfsequence: uint16_t] [id: uint16_t] [数据: x]地点:

  1. numberOfsequence: 是我的数据包的编号(保证在
    按顺序接收数据包,我知道这是自动调节的TCP 协议(protocol),但我也想这样做)
  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 不处理数据包,而是处理流。底层协议(protocol)可能会分割或合并您的数据包,然后您必须自行处理和更正这些数据包。

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

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

可以看到,dlength字段表示数据部分的长度。接收端在读取data字段之前,需要先解析dlength信息。如果接收到的“数据包”包含的字节数多于 dlength 字段指示的字节数,则溢出的字节实际上是下一个数据包的一部分。如果 dlength 值大于接收到的数据,则必须等待发送方将剩余数据写入流。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com