2009-08-24 2 views
0

P/Invokeを使用してネイティブDLLとやりとりしようとしていますが、構造パラメータin_addrが必要です。私はそれについて多くの異なる種類の定義を見ていますが、どちらを使うのがベストですか?Cでのin_addrの使用#

また、C#IPAddressオブジェクトをin_addr構造体に変換するにはどうすればよいですか?

答えて

2

は、匿名の名前をクリーンアップPInvoke Interop Assistant

EDITで生成され、次の

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

を試してみてください。

+0

これをIPAddressオブジェクトとの間で変換する方法はありますか? –

+0

@David、組み込み関数はありませんが、コード化するのはあまりにも恐ろしいことではありません。 – JaredPar

+0

私はCの経験があまりありませんでしたので、私にこの権利があるかどうか教えてください。 BitConverterを使ってIPAddressのバイトをInt32に変換し、それをS_addrに割り当てました(それをuintにキャストします)。 Anonymous2の4バイトのフィールド(s_b1-s_b4)には、IPAddressのバイト配列の最初の4バイトがそれぞれ割り当てられます。それは働くだろうか? s_w1とs_w2をどうすればいいですか? –

4

誰かが興味がある場合は、ここに完全なコードがあります。 IPAddressオブジェクトを構造体in_addrにアンパックして戻すことができます。 JaredPar同様

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

} 

、私はまだAnonymous3で何をするかわかりませんが、それはとにかく設定することができないので、それは本当に問題ではありません。それらはすべて同じFieldOffsetを持つため、1つのフィールドを設定すると他のすべてのフィールドがクリアされます。でも、私はあまり心配していません。

関連する問題