C# TCP 数据包结构
C# TCP packet structure
我正在使用C++编码的服务器在C#中开发聊天应用程序,我已经可以在客户端之间发送和接收消息。但是,我现在的问题是,我想自己定义TCP数据包的结构,例如:
[序列数: uint16_t] [编号: uint16_t] [数据: x]哪里:
- numberOfsequence:是我的数据包的编号(以保证在
按顺序接收数据包,我知道这是自动接收的TCP协议,但我也想这样做( - 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不处理数据包,而是处理流。底层协议可能会对您的数据包进行切片或组合,然后您必须自行处理和更正。
因此,如果我们假设numberOfSequence
和id
字段是固定长度的,但data
字段的长度可能会有所不同,这是我建议的数据包结构:
numberOfSequence: 2 bytes
id: 2 bytes
dlength: 2 bytes
data: dlength bytes
如您所见,dlength
字段指示数据部分的长度。接收端应在读取data
字段之前解析dlength
信息。如果收到的"数据包"包含的字节数多于dlength
字段指示的字节数,则溢出的字节实际上是下一个数据包的一部分。如果dlength
值大于接收的数据,则必须等到发送方将其余数据写入流。
相关文章:
- 如何在C++中序列化结构数据
- boost::asio UDP 广播客户端仅接收"fast"数据包
- 如何使用发送数据包所花费的时间计算两个节点之间的距离?
- 发送固定大小的 UDP 数据包
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 在 c++ 中解析数据包数据的最佳方法是什么?
- 接受函数在发送数据包时等待
- 如何在 omnet++ 中发送自定义数据包?
- 正在转换结构数据的字节序
- 是否可以将多个结构作为一个数据包存储在一个函数中,然后传递给其他函数并在那里提取?
- Twitch的RTMP广播数据包体结构
- 如何通过解析缓冲区并将数据放入正确的结构来处理传入的数据包连接?
- TCP-Server以数据包结构(非Java客户端)发送文件
- 表示命令数据包格式的数据结构
- 使用 UDP 协议从 Windows 套接字发送到 Qt 套接字的网络数据包上的结构编码和解码
- C# TCP 数据包结构
- 试图将带有结构双重指针的数据包发送给客户端时,访问违规行为.C 视觉工作室
- 数据包转换为具有多个动态数组的结构
- SFML 使用结构发送数据包不起作用
- 将结构序列化/反序列化为二进制数据包