【问题标题】:Understanding Server Protocol了解服务器协议
【发布时间】:2011-06-17 22:56:26
【问题描述】:

(我专门使用VB.net,我指的协议是用于“我的世界服务器”)

我有以下链接,了解有关我正在制作的服务器协议的详细信息。

Protocol

现在,根据这个协议,前三个字节应该指定数据包类型。我检查了将连接到服务器的客户端的实际源代码(在 java 中),并验证这是真的。

问题是,前三个字节值应该是数据包编号的十六进制。

我正在使用的特定数据包(客户端发送的第一个验证数据包)。

Protocol :: Client Server Handshake:(我没有足够高的信誉等级来发布第二个链接,我会以纯文本形式发布)

mc.kev009.com/wiki/Protocol#Client_to_Server_2

我可以读取显示客户端发送的“用户名”的前三个字节之后提供的字符串。问题是,我不知道如何识别前三个。这不是我的预期。

我假设在将整个结果转换为可读字符串后,前三个字符类似于 002 或 200。相反,我收到了 ASCII 码为“2”、“0”和“8”的字符。我知道数据包编号是 2,为什么会得到如此奇怪的结果?

这是我目前正在使用的代码:

代码:

cWrite("Waiting for client initiated 'handshake'...")
    Dim HandshakePacket As String = PW.getTextPackets(clientStream)
    cWrite(HandshakePacket.Substring(3).Trim & " has requested the required 'handshake'...")
    Try
        Select Case Convert.ToInt32(HandshakePacket.Substring(0, 3), 16)
            Case 2
                cWrite("~HANDSHAKE PACKET~")
            Case Else
                cWrite("Packet id: " & Convert.ToInt32(HandshakePacket.Substring(0, 3), 16) & " not recognized!")
        End Select
    Catch ex As Exception
        '???
    End Try

-cWrite 是一个基本显示信息的函数(调试输出的一种形式) -PW 包含用于以字符串和字节形式发送/接收数据包的类。 -PW.getTextPackets 返回已经从默认字节形式转换为 ASCII 的数据包发送的请求 -clientStream 只是来自 clientTcp 的底层流

有人可以详细说明我做错了什么吗?

【问题讨论】:

  • 该编辑是不必要的。标题需要保持原样。如果您考虑到这一点,我的问题是关于理解发送给我的字节,不一定要求您完全了解协议。我仅包含协议信息,以便您可以将其与我提供的代码进行比较。

标签: vb.net tcp protocols tcpclient


【解决方案1】:

数据包类型是 1 个字节,而不是 3 个字节。描述3 bytes + length of strings 指的是1 字节的数据包ID 和描述字符串长度的2 字节big-endian 短值。所以你正在阅读的02 00 08表示数据包类型2,字符串长度为8。接下来的8个字节将是字符串的内容。

【讨论】:

  • 哇,谢谢!我一直在到处寻找这些信息!
  • 字符串的描述在您的协议链接中的数据类型下。 UTF-8 string. Prefixed by a short containing the length of the string。附言单击复选标记将接受答案;^)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2011-01-29
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多