Как передать (преобразовать) struct в socket?

Есть структура:
        [StructLayout(LayoutKind.Sequential, Pack = 1)]        struct DataBlock        {            public ****** data0;            public ****** data1;            public ****** data2;            public ****** data3;        }        [StructLayout(LayoutKind.Sequential, Pack = 1)]        struct Packet        {            public ****** SOP;            public UInt16 PacketSize;            public UInt16 ProtocolVersion;            public UInt16 Code;            public UInt16 SubCode;            public UInt16 Reserve0;            public UInt16 Reserve1;            public UInt16 numblocks;            public DataBlock[] Data;              public ****** EOP;           };
Как ее передать/принять в socket? Передача доп. информации исключена (Serialize не годится).
2 ответа

Serialize не годится
ну тогда ручками            BitConverter.********(buff, 0);


        public static byte [] StructToByteArray<T>(T _struct)        {            byte[] data = new byte[Marshal.SizeOf(typeof(T))];            IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(typeof(T)));            Marshal.StructureToPtr(_struct, pointer, false);            Marshal.Copy(pointer,data, 0, Marshal.SizeOf(typeof(T)));            Marshal.FreeHGlobal(pointer);            return data;        }
Важно правильно описать передаваемую структуру. Массивы байт определяются как в примере ниже
[StructLayout(LayoutKind.Sequential,Pack = 1,Size=128)]public struct PCXHeader{       public byte Manufacturer;        // Постоянный флаг 10 = ZSoft .PCX       public byte Version;             // 0 = Версия 2.5                                        // 2 = Версия 2.8 с информацией о палитре                                        // 3 = Версия 2.8 без информации о палитре                                        // 5 = Версия 3.0       public byte Encoding;            // 1 = .PCX кодирование длинными сериями       public byte BitsPerLayer;        // Число бит на пиксел в слое       public **** Xmin;                // Размеры изображения       public **** Ymin;                // Размеры изображения       public **** Xmax;                // Размеры изображения       public **** Ymax;                // Размеры изображения       public **** HRes;                // Горизонтальное разрешение создающего устройства       public **** VRes;                // Вертикальное разрешение создающего устройства       [MarshalAs(UnmanagedType.ByValArray,SizeConst = 48)]        public byte[] Colormap;      // Набор цветовой палитры (см. далее текст)       public byte Reserved;       public byte NPlanes;             // Число цветовых слоев       public **** BPL;                 // Число байт на строку в цветовом слое                                        // (для PCX-файлов всегда должно быть четным)       public **** Palette;             // Как интерпретировать палитру:                                        // 1 = цветная/черно-белая,                                        // 2 = градации серого       [MarshalAs(UnmanagedType.ByValArray, SizeConst = 58)]        public byte[] Filler;        // Заполняется нулями до конца заголовка}