2009-08-24 10 views
0

J'essaye d'interagir avec une DLL native en utilisant P/Invoke, mais cela nécessite un paramètre struct in_addr. Je continue à voir beaucoup de différents types de définitions, mais quel est le meilleur à utiliser?Utilisation de in_addr en C#

De même, comment puis-je convertir un objet C# IPAddress en un struct in_addr?

Répondre

2

Essayez le

[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct in_addr { 

    /// Anonymous1 
    public Anonymous1 S_un; 
} 

[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Explicit)] 
public struct Anonymous1 { 

    /// Anonymous2 
    [System.Runtime.InteropServices.FieldOffsetAttribute(0)] 
    public Anonymous2 S_un_b; 

    /// Anonymous3 
    [System.Runtime.InteropServices.FieldOffsetAttribute(0)] 
    public Anonymous3 S_un_w; 

    /// u_long->unsigned int 
    [System.Runtime.InteropServices.FieldOffsetAttribute(0)] 
    public uint S_addr; 
} 

[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct Anonymous2 { 

    /// u_char->unsigned char 
    public byte s_b1; 

    /// u_char->unsigned char 
    public byte s_b2; 

    /// u_char->unsigned char 
    public byte s_b3; 

    /// u_char->unsigned char 
    public byte s_b4; 
} 

[StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] 
public struct Anonymous3 { 

    /// u_short->unsigned short 
    public ushort s_w1; 

    /// u_short->unsigned short 
    public ushort s_w2; 
} 

Généré avec PInvoke Interop Assistant

EDIT Nettoyé les noms anonymes suivants.

+0

Y a-t-il un moyen de convertir cela vers et depuis un objet IPAddress? –

+0

@David, il n'y a pas de fonction intégrée, mais il ne devrait pas être trop terrible pour le code. – JaredPar

+0

Je n'ai pas eu beaucoup d'expérience avec C, alors laissez-moi savoir si j'ai ce droit. J'ai utilisé BitConverter pour convertir les adresses IPAddress en un Int32, puis l'ai assigné à S_addr (en le convertissant en uint). Les champs de 4 octets (s_b1-s_b4) dans Anonymous2 sont affectés chacun des 4 premiers octets du tableau d'octets IPAddress. Ça marchera? Que dois-je faire avec s_w1 et s_w2? –

4

Si quelqu'un est intéressé, voici le code complet. Il est capable de déballer un objet IPAddress à struct in_addr et vice versa.

[StructLayout(LayoutKind.Sequential)] 
public struct in_addr { 
    public Anonymous1 S_un; 

    [StructLayoutAttribute(LayoutKind.Explicit)] 
    public struct Anonymous1 { 
     [FieldOffsetAttribute(0)] 
     public Anonymous2 S_un_b; 

     [FieldOffsetAttribute(0)] 
     public Anonymous3 S_un_w; 

     [FieldOffsetAttribute(0)] 
     public uint S_addr; 
    } 

    [StructLayoutAttribute(LayoutKind.Sequential)] 
    public struct Anonymous2 { 
     public byte s_b1; 
     public byte s_b2; 
     public byte s_b3; 
     public byte s_b4; 
    } 

    [StructLayoutAttribute(LayoutKind.Sequential)] 
    public struct Anonymous3 { 
     public ushort s_w1; 
     public ushort s_w2; 
    } 

    public in_addr(IPAddress address) : this(address.GetAddressBytes()) { } 

    public in_addr(byte[] address) { 
     // Set this first, otherwise it wipes out the other fields 
     S_un.S_un_w = new Anonymous3(); 

     S_un.S_addr = (uint)BitConverter.ToInt32(address, 0); 

     S_un.S_un_b.s_b1 = address[0]; 
     S_un.S_un_b.s_b2 = address[1]; 
     S_un.S_un_b.s_b3 = address[2]; 
     S_un.S_un_b.s_b4 = address[3]; 
    } 

    /// <summary> 
    /// Unpacks an in_addr struct to an IPAddress object 
    /// </summary> 
    /// <returns></returns> 
    public IPAddress ToIPAddress() { 
     byte[] bytes = new[] { 
      S_un.S_un_b.s_b1, 
      S_un.S_un_b.s_b2, 
      S_un.S_un_b.s_b3, 
      S_un.S_un_b.s_b4 
     }; 

     return new IPAddress(bytes); 
    } 

} 

Comme JaredPar, je ne sais toujours pas quoi faire avec Anonymous3, mais il ne compte pas vraiment, car il ne peut pas être de toute façon. Comme ils ont tous le même FieldOffset, la définition d'un champ efface tous les autres. Cela semble fonctionner, cependant, je ne suis pas trop inquiet à ce sujet.