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

时间:2013-09-16 16:54:04

标签: c# .net sockets tcp udp

我正在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开始?

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

1 个答案:

答案 0 :(得分:0)

当您处理网络通信时,您必须定义“协议”以定义“消息”的内容,因为网络连接是Stream based not Message based

因此在protocal中定义如下

Description   -> |dataIdentifier|name length|message length|    name   |    message   |
Size in bytes -> |       4      |     4     |       4      |name length|message length|

int始终为System.Int32System.Int32始终需要4个字节进行存储(将32除以8得到4)。

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

Description   -> |dataIdentifier|name length|message length|    name   |    message   |
Size in bytes -> |       4      |     4     |       4      |name length|message length|
Data Type     -> |      int     |    int    |      int     |  string   |    string    |

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

让我们重新设置架构,但这次我会,但数字下降表示字节数

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

Description   -> |dataIdentifier|name length|message length|             name              |                      message                                             |
Size in bytes -> |       4      |     4     |       4      |         name length           |                  message length                                          |
Bytes         -> |0 1 2 3       | 4 5 6 7   | 8 9 10 11    | 12 through (12 + name length) | (12 + name length) + 1 through ((12 + name length) + 1 + message length) |

所以你可以看到读dataIdentifier我们从索引0开始读取4个字节(这将是多少BitConverter.ToInt32将读取)。然后,当我们想要读取nameLength时,我们需要从索引4开始,然后读取另外4个字节,这就是为什么BitConverter.ToInt32被传递4(并且messageLength将被传递8)

如果有任何不清楚的地方,请在评论中说明,我会详细说明。