聊天应用程序 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 开始?
非常感谢你,对不起我的英语。
处理网络通信时,必须定义一个"协议"来定义"消息"是什么,因为网络连接是基于流而不是基于消息的。
所以在原型中定义为如下
说明 -> |数据标识符|名称长度|消息长度| 姓名 | 在线留言 |大小(以字节为单位) -> | 4 | 4 | 4 |名称长度|消息长度|
int
始终是System.Int32
,System.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)
如果有什么不清楚的地方,请在评论中说出来,我会详细说明。