我正在使用C#编码的服务器在C#中使用聊天应用程序,我已经可以在客户端之间发送和接收消息。
但是,现在的问题是,我想自己定义TCP数据包的结构,例如:
[numberOfsequence:uint16_t] [id:uint16_t] [data:x]
在哪里:
按顺序接收数据包,我知道这是由自动控制的
TCP协议(protocol),但我也想这样做)
操作(登录,消息,断开连接)的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)可能会切片或合并您的数据包,然后您必须处理并更正自己。
因此,如果我们假设numberOfSequence
和id
字段为固定长度,但是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/