聊天应用程序 UDP 中数据包的 C# 问题

本文关键字:问题 数据包 应用程序 UDP 聊天 | 更新日期: 2023-09-27 18:31:33

我正在研究 http://www.daveoncsharp.com/2009/08/csharp-chat-application-over-asynchronous-udp-sockets-part-1 教程中的一个聊天应用程序。但是我有一个问题,任何人都可以为我解释,在"数据包类"中,为什么我们知道"dataIdentifier"的"字节大小"是4,"名称长度"是4,我在数据包类的顶部看到描述,但我不知道为什么。而这些:

this.dataIdentifier = (DataIdentifier)BitConverter.ToInt32(dataStream, 0);//我们将从 dataStream 的索引 0 转换,但它如何知道结束???

int nameLength = BitConverter.ToInt32(dataStream, 4);//为什么我们知道它从 4 开始?

非常感谢你,对不起我的英语。

聊天应用程序 UDP 中数据包的 C# 问题

处理网络通信时,必须定义一个"协议"来定义"消息"是什么,因为网络连接是基于流而不是基于消息的。

所以在原型中定义为如下

说明 -> |数据标识符|名称长度|消息长度|   姓名 |   在线留言 |大小(以字节为单位) -> |      4 |    4 |      4 |名称长度|消息长度|

int始终是System.Int32System.Int32始终需要 4 个字节来存储(32 除以 8,得到 4)。

这是另一行显示每列的数据类型,也许这会对您有所帮助

说明 -> |数据标识符|名称长度|消息长度|   姓名 |   在线留言 |大小(以字节为单位) -> |      4 |    4 |      4 |名称长度|消息长度|数据类型 -> |     国际 |   国际 |     国际 | 字符串 |   字符串 |

那么,现在为什么我们在位转换器中跳过 4 个字节。

让我们备份架构,但这次我会但数字下降表示字节数

现在最后两个是"特殊的",它们的长度不像前 3 个那样是固定长度,它们所做的是从前一列中获取值,即读取了多少字节。

说明 -> |数据标识符|名称长度|消息长度|            姓名 |                     在线留言 |大小(以字节为单位) -> |      4 |    4 |      4 |        名称长度 |                 消息长度 |字节 -> |0 1 2 3 |4 5 6 7 |8 9 10 11 |12 到 (12 + 名称长度) |(12 + 名称长度) + 1 到 ((12 + 名称长度) + 1 + 消息长度) |

因此,您可以看到读取dataIdentifier我们从索引 0 开始并读取 4 个字节(这是将读取的BitConverter.ToInt32数)。然后当我们想读取nameLength我们需要从索引 4 开始,然后再读取 4 个字节,这就是为什么BitConverter.ToInt32传递 4(messageLength 将被传递 8)

如果有什么不清楚的地方,请在评论中说出来,我会详细说明。