Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

Hi,

 

I have been making a game that uses TCP and UDP. For the UDP part it sends information such as player location, bullet information, and particle effects. I am having problems working out the best way to send the information over UDP.

 

At the moment I am using the following 2 functions to convert a Structure to a Byte(), and vice versa.

 

   Public Function StructToBytes(ByVal InStruct As Object) As Byte()
       Dim Ptr As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(InStruct))
       Dim ByteArray(Marshal.SizeOf(InStruct) - 1) As Byte
       Marshal.StructureToPtr(InStruct, Ptr, False)
       Marshal.Copy(Ptr, ByteArray, 0, Marshal.SizeOf(InStruct))
       Marshal.FreeHGlobal(Ptr)
       Return ByteArray
   End Function

 

and,

 

   Public Function BytesToStruct(ByVal Buff() As Byte, ByVal MyType As System.Type) As Object
       Dim MyGC As GCHandle = GCHandle.Alloc(Buff, GCHandleType.Pinned)
       Dim Obj As Object = Marshal.PtrToStructure(MyGC.AddrOfPinnedObject, MyType)
       MyGC.Free()
       Return Obj
   End Function

 

The problem is that ideally I want to have several different types of structure. Eg, a Structure that is only for updating a players position, or a Structure only for a particle effect. At the moment I only have one big structure, will all information in it, because I have to convert the structure at the other end, so I always know what type it is. If I have more than one type of structure, then I dont know the Type at the other end to convert it back from a byte array.

 

Looking for some ideas if you have any. I was thinking of somehow using an Enum to specify the type of the structure, but not too sure.

 

Cheers,

 

Pinky

  • Administrators
Posted

Rather than rely on GC handles and a lot of interop code why don't you just serialize to a byte array?

'For a structure
<Serializable()> _
Structure SampleStruct
   Public i As Integer
   Public s As String
   'etc.
End Structure

'the following should work...

Dim ms As New IO.MemoryStream()
Dim s As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter()

'any old sample structure / data
Dim test As SampleStruct
test.i = 1000
test.s = "Hello World"

s.Serialize(ms, test)

'following just removes any padding as allocated by ms
Dim b(ms.Position) As Byte
Array.Copy(ms.GetBuffer, b, ms.Position)
'b() now contains a serialized version of test
ms.Close()

 

If you are using something like this then just declare an enum of all posible structure types and send that as the first byte / integer of the packet and deserialize the correct structure based on it's value at the other end.

Posting Guidelines FAQ Post Formatting

 

Intellectuals solve problems; geniuses prevent them.

-- Albert Einstein

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...