Sockets 从序列化网络数据包解释数据

Sockets 从序列化网络数据包解释数据,sockets,networking,serialization,protobuf-net,packet-capture,Sockets,Networking,Serialization,Protobuf Net,Packet Capture,我已经按照教程设置了数据包捕获程序,我被告知数据包是由protobuf序列化的。目前,将数据包转换为如下图所示的字符串只适用于少量信息,这是不够的 我不知道如何从下面将数据包转换成可接受的格式,以便能够将其反序列化为我可以使用的格式。下面是Wireshark中出现的数据包示例 DRDNi|L.TE@4jcP""P.-h" 二, : 2. : 2. : 2. $ % 4. 4+ : 2. : 2. A?CCS2_121-/01 C : 二, : 我希望数据包的格式与我所听到的类似 li

我已经按照教程设置了数据包捕获程序,我被告知数据包是由protobuf序列化的。目前,将数据包转换为如下图所示的字符串只适用于少量信息,这是不够的

我不知道如何从下面将数据包转换成可接受的格式,以便能够将其反序列化为我可以使用的格式。下面是Wireshark中出现的数据包示例

DRDNi|L.TE@4jcP""P.-h"
二, : 2. : 2.

: 2. $ % 4. 4+ : 2. : 2. A?CCS2_121-/01 C

:

二, :

我希望数据包的格式与我所听到的类似

list: <
show_entity: <
entity: 29
name: "EX1_306"
tags: <
  name: 45
  value: 3
>
tags: <
  name: 47
  value: 4
>
tags: <
  name: 48
  value: 2
>
tags: <
  name: 49
  value: 1
>
tags: <
  name: 201
  value: 3
>
tags: <
  name: 202
  value: 4
>
tags: <
  name: 203
  value: 2
>
tags: <
  name: 218
  value: 1
>
>
下面的代码是我用来捕获数据包并将其转换为我可以读取一些信息的格式的代码。我无法让protobuf将其反序列化为任何格式

    Private Sub PacketCap()
    Dim Index As Integer = 0
    Dim allDevices As IList(Of LivePacketDevice) = LivePacketDevice.AllLocalMachine
    Dim device As LivePacketDevice = allDevices(1)
    Dim Selecteddevice As PacketDevice = device

    Using communicator As PacketCommunicator = Selecteddevice.Open(65536, PacketDeviceOpenAttributes.Promiscuous, 1000)
        communicator.SetFilter("port 3724")
        ' read timeout

        ' start the capture
        packetcount = 0
        Invoke(New MethodInvoker(Sub()
                                     MetroListbox1.Items.Add("Started Cap")
                                 End Sub))

        communicator.ReceivePackets(0, AddressOf PacketHandler)
    End Using


End Sub

Private Sub MetroButton2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MetroButton2.Click
    Dim N As New Threading.Thread(AddressOf PacketCap)
    N.Start()
End Sub

Private Sub PacketHandler(ByVal packet As PcapDotNet.Packets.Packet)
    Invoke(New MethodInvoker(Sub()
                                 'ListBox1.Items.Add(packet.Timestamp.ToString("yyyy-MM-dd hh:mm:ss.fff") & " length:" & Convert.ToString(packet.Length) + packet.ToString("X2"))
                                 If packet.Length < 200 Then
                                 Else
                                     Const LineLength As Integer = 64
                                     Dim Info As String
                                     Dim i As Integer = 0
                                     While i <> packet.Length
                                         Info = Info + (packet(i)).ToString("X2")
                                         If (i + 1) Mod LineLength = 0 Then

                                         End If
                                         i += 1
                                     End While
                                 End If

                             End Sub))
很抱歉“几乎完成”的格式设置,这是我在这里的第一个问题。非常感谢您的帮助

电线规格已确定。然而,protobuf格式在形式上是不明确的,因为通常通过.proto文件缺少模式。没有单一的解释数据的方法。但是,您可能会根据导线类型对头的前3位进行一些粗略猜测

0是一个变量;可能最好是简单地解码变量并将其显示为一个int64 1是64位的。。。棘手-没有真正的方法来选择这些;也许假设固定64? 2是长度前缀-您可以尝试嵌套内容,看看它是否为UTF-8;如果是,则假定它是一个字符串;否则,查看它是否解析为子对象;然而,它也可能是一个复杂的压缩数组 3是起始组-嵌套子对象 4是端组-上述的结束 5是32位的-类似于1-可能假定为fixed32?
不过,坦白说,这将是一个非常容易出错的问题,我看不出有什么意义。

顺便说一句,我在一般情况下回答说,您希望能够处理任何数据。如果您只想处理一个模式,那么这是一个不同的更容易的场景-可能会在几行中被欺骗