我正在使用c ++编写的服务器在c#中处理聊天应用程序,我已经可以在我的客户端之间发送和接收消息。 但是,我现在的问题是,想要自己定义TCP数据包的结构,如:
[numberOfsequence:uint16_t] [id:uint16_t] [data:x] 其中:
数据:信息。
//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();
所以我的问题是如何定义数据包结构?感谢
答案 0 :(得分:1)
您应该在数据包结构中包含data
字段的长度。这是因为TCP不处理数据包而是处理流。底层协议可能会对您的数据包进行分片或组合,然后您必须自己处理并纠正这些数据包。
因此,如果我们假设numberOfSequence
和id
字段是固定长度的,但data
字段的长度可能不同,这是我建议的数据包结构:
numberOfSequence: 2 bytes
id: 2 bytes
dlength: 2 bytes
data: dlength bytes
如您所见,dlength
字段表示数据部分的长度。接收端应在阅读dlength
字段之前解析data
信息。如果收到"包"包含的字节数多于dlength
字段所指示的字节数,溢出的字节实际上是下一个数据包的一部分。如果dlength
值大于接收的数据,则必须等到发送方将其余数据写入流中。