Master Server Query Protocol/Parsing packet
To get each octet you must convert the hex pairs into int32. When the packet is received by your UDP client, the hex values will be converted into their integer values. For example hex "ff" will be converted into "255" in a byte array. We don't want that 255 because the addresses that we are receiving are made up of 6 pairs. 4 pairs are for the octets and the remaining two are combined together to create the port.
An example code for parsing the packet:
Public Function browser_ConnectMaster(Byval ipStartSeed As String, Byval allFilters As String, Byval regionCode As String) As Byte() Dim ip As String = browser_ToString(UnicodeEncoding.ASCII.GetBytes(ipStartSeed)) Dim filter As String = browser_ToString(UnicodeEncoding.ASCII.GetBytes(allFilters)) hexString = "31" & regionCode & ip & "00" & filter & "00" byteArray = browser_GetBytes(hexString, discarded) Public WithEvents udpClientM1, udpClient As New Sockets.UdpClient Dim receivedBytes As Byte() = New Byte() {} Dim pret As Integer Public RemoteIpEndPoint As New System.Net.IPEndPoint(System.Net.IPAddress.Any, 0) udpClientM1.Connect("72.165.61.136", 27010) ' Main Server RemoteIpEndPoint = udpClientM1.Client.RemoteEndPoint pret = udpClientM1.Send(byteArray, byteArray.Length) receivedBytes = udpClientM1.Receive(RemoteIpEndPoint) Dim retrievedServers() As String = browser_ToStringOriginal(receivedBytes).Split(" ") Return retrievedServers End Function Public Shared Function browser_ToStringOriginal(ByVal bytes As Byte()) As String Dim hexString As String = "" For i As Integer = 0 To bytes.Length - 1 Dim newByteStr As String = Convert.ToString(bytes(i), 16) If newByteStr.Length < 2 Then ' Hex pair must always have two chars hexString += "0" & newByteStr & " " Else hexString += newByteStr & " " End If Next Return hexString End Function Public Shared Function browser_ToString(ByVal bytes As Byte()) As String Dim hexString As String = "" For i As Integer = 0 To bytes.Length - 1 hexString += bytes(i).ToString("X2") Next Return hexString End Function Public Shared Function browser_GetBytes(ByVal hexString As String, ByRef discarded As Integer) As Byte() discarded = 0 Dim newString As String = "" Dim c As Char ' remove all none A-F, 0-9, characters For i As Integer = 0 To hexString.Length - 1 c = hexString(i) If IsHexDigit(c) Then newString += c Else discarded += 1 End If Next ' if odd number of characters, discard last character If newString.Length Mod 2 <> 0 Then discarded += 1 newString = newString.Substring(0, newString.Length - 1) End If Dim byteLength As Integer = newString.Length / 2 Dim bytes As Byte() = New Byte(byteLength - 1) {} Dim hex As String Dim j As Integer = 0 For i As Integer = 0 To bytes.Length - 1 hex = New [String](New [Char]() {newString(j), newString(j + 1)}) bytes(i) = HexToByte(hex) j = j + 2 Next Return bytes End Function
The above code will do the following: Connect to the master server, send a UDP query with specific variables (region code, start seed, filters), receive packet into byte array, convert byte array in hex array.
Now that we have converted the byte array into a hex array, we must convert each hex pair into its int32 equivalent.
Dim serverList As New Hashtable() Private Sub browser_ParsePacket(Byval packet As String()) Dim countPrimary, countSecondary As Integer Dim address, portBuilder, lastAddress As String Try For Each hexPair As String In packet If Not hexPair = Nothing Then countPrimary += 1 If countPrimary > 6 Then If countSecondary <= 2 Then ' Get first 3 octets address = address & Convert.ToInt32(hexPair, 16) & "." ElseIf countSecondary = 3 Then ' Fourth octet must have a trailing : address = address & Convert.ToInt32(hexPair, 16) ElseIf countSecondary > 3 Then ' Get last two hex pairs to form the port portBuilder = portBuilder & hexPair End If If countSecondary = 5 Then ' Convert the combined hex pairs into an integer portBuilder = Convert.ToInt32(portBuilder, 16) End If countSecondary += 1 End If If countSecondary = 6 Then lastAddress = address & ":" & portBuilder serverList.Add(serverList.Count + 1, address & ":" & portBuilder) countSecondary = 0 portBuilder = 0 address = String.Empty End If End If Next Catch ex As Exception MsgBox(ex.Message) End Try If Not lastAddress = "0.0.0.0:0" Then browser_ConnectMaster(lastAddress, "\napp\500", "00") Exit Sub Else For Each item As DictionaryEntry In serverList browser_HostConnect(item.Value) Next End If End Sub
This above code will go through each and every hex pair in the array. Ever 6 pairs (12 characters) is another IP address. It will add the found IP address to hashtable which can again be put through a loop to extract the addresses to connect and query later on.
(Code written by Erix920, your welcome devs :))