2012-05-31 12 views
5

tengo una estructura ++ C a continuación:Convertir C++ struct en C#

struct CUSTOM_DATA { 
    int id; 
    u_short port; 
    unsigned long ip; 
} custom_data; 

¿Cómo puedo convertir a C# struct, serializarlo y enviar a través del socket TCP?

Gracias!

UPD

Así que habrá de código C#?

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
public int id; 
public ushort port; 
public uint ip; 
} 

public void Send() 
{ 
CustomData d = new CustomData(); 
d.id = 12; 
d.port = 1000; 
d.ip = BitConverter.ToUInt32(IPAddress.Any.GetAddressBytes(), 0); 
IntPtr pointer = Marshal.AllocHGlobal(Marshal.SizeOf(d)); 
Marshal.StructureToPtr(d, pointer, false); 
byte[] data_to_send = new byte[Marshal.SizeOf(d)]; 
Marshal.Copy(pointer, data_to_send, 0, data_to_send.Length); 
client.GetStream().Write(data_to_send, 0, data_to_send.Length); 
} 

Respuesta

9

El C# versión de esta estructura sería:

[StructLayout(LayoutKind.Sequential)] 
public struct CustomData 
{ 
    public int id; 
    public ushort port; 
    public uint ip; 
} 

Como para enviar este a través de un enchufe, sólo puede enviar los datos binarios directamente. El Marshal class tiene métodos para obtener un puntero (IntPtr) de la estructura y copiar en una matriz de bytes.

+0

Gracias por su respuesta, ¿me pueden ayudar, es todo muy bien con mi código acerca de la copia de amortiguar y de enviarlo? – Becker

+0

@Becker Debe usar StructureToPtr, no GetComInterfaceForObject. Ver: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

¡Gracias! Lo siento, nunca hice cosas como esta antes. Edité mi código, ¿ahora todo está bien? – Becker

1
[StructLayout(LayoutKind.Sequential)] 
struct CUSTOM_DATA { 
    int id; 
    ushort port; 
    uint ip; 
}; 
CUSTOM_DATA cData ; // use me 

edición: THX caña

+3

Debe ser cierto, no ulong - Un C++ "sin signo de longitud" es de 4 bytes, es decir: UInt32 en C# –