I'll try to be clearer: 1) Can I pass void* PacketStart, long PacketSize or Do I need to go the managed way? You need to get from the the managed world to the pointer world somehow to use the pointer operations. If you pass in a MyStruct (for example), you would do the fixed statement in your routine. If you want to pass in a pointer, you'd have to do the fixed statement in the caller of the routine. While you'll have to write a separate routine for each struct, I think that writing the managed version and putting all the ugliness in your routine is the rigth 2) Are those two method declarations equivalent? No, though they are similar. I'm not sure the object version is feasible, though I've never tried it myself. 3) If i pass void*, what would be the substitute for MyStruct? If you pass a byte* (on reflection, I don't think void* will work), you would need to copy the bytes over one by one to the byte buffer, based on the length you'd pass in. 4) *((object) pBuffer) = PacketStart; ( results in Cannot convert type 'byte*' to 'object') Object won't work here, because the compiler does't know how big the actual object is. 5) Could you give an example how to go, to receive the respective byte[] in this specific case? Here's some code I wrote up. It compiles, but I haven't actually tested it: using System; using System.IO; using System.Net.Sockets; namespace ConsoleApplication7 { struct MyStruct { int i; float j; } /// /// Summary description for Class1. /// class Class1 { /// /// The main entry point for the application. /// [STAThread] static void Main(string[] args) { // // TODO: Add code to start application here // } public unsafe void SendMyStruct(MyStruct myStruct, Socket socket) { byte[] buffer = new byte[sizeof(MyStruct)]; fixed (byte* pBuffer = buffer) { *((MyStruct*)pBuffer) = myStruct; } socket.Send(buffer); } public unsafe MyStruct ReadMyStruct(Socket socket) { byte[] buffer = new byte[sizeof(MyStruct)]; socket.Receive(buffer); MyStruct myStruct; fixed (byte* pBuffer = buffer) { myStruct = *((MyStruct*)pBuffer); } return myStruct; } } }