【问题标题】:C# issue with packet in chat application UDP聊天应用程序 UDP 中的数据包的 C# 问题
【发布时间】:2013-09-20 22:02:14
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# .net sockets tcp udp


    【解决方案1】:

    当您处理网络通信时,您必须定义一个“协议”来定义您的“消息”是什么,因为网络连接是Stream based not Message based

    所以在protocal中定义如下

    描述 -> |数据标识符|名称长度|消息长度|姓名 |留言 | 以字节为单位的大小 -> | 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)

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

    【讨论】:

    • 非常感谢,问题我已经明白了!
    • 不好意思,请问是enum类型和int类型都需要4个字节存储吗?
    • 这完全取决于枚举是如何定义的,默认情况下,枚举存储为int,但看看the documentation"每个枚举类型都有一个底层类型,可以是除 char 以外的任何整数类型。枚举元素的默认底层类型是 int。要声明另一个整数类型的枚举,例如字节,请在标识符后使用冒号,后跟类型..."因此,如果他们使用默认值,如果 intint 需要 4 个字节来存储,那么是的,枚举需要 4 个字节(如果他们使用 int 作为支持)
    • 谢谢@Scott,我还有一个问题是我们如何知道“dataIdentifier”的前 4 个字节、“nameLength”的第二个字节的 4 个字节和“msgLength”的下一个字节?为什么前 4 个字节不是“nameLength”?
    猜你喜欢
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多