2012-05-31 20 views
5

Ho un ++ struct C al di sotto:Convert C++ struct in C#

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

come posso convertirlo in C# struct, serializzare e inviare tramite il socket TCP?

Grazie!

upd

Così C# codice sarà?

[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); 
} 

risposta

9

La versione C# di questo struct sarebbe:

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

Per quanto riguarda l'invio di questo tramite una presa, si può semplicemente inviare direttamente i dati binari. Il Marshal class ha metodi per ottenere un puntatore (IntPtr) dalla struttura e copiare in un array di byte.

+0

Grazie per la risposta, mi potete aiutare, è tutto ok con il mio codice sulla copia di buffer e inviarlo? – Becker

+0

@Becker È necessario utilizzare StructureToPtr, non GetComInterfaceForObject. Vedi: http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.marshal.structuretoptr.aspx#Y1000 –

+0

Grazie! Scusa, non ho mai fatto cose del genere prima d'ora. Ho modificato il mio codice, ora tutto ok? – Becker

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

edit: thx canna

+3

Dovrebbe essere uint, non ulong - Un C++ "unsigned long" è 4 byte, ovvero: UInt32 in C# –