C# 在C中使用in_addr#

C# 在C中使用in_addr#,c#,struct,pinvoke,ip-address,in-addr,C#,Struct,Pinvoke,Ip Address,In Addr,我试图使用p/Invoke与本机DLL交互,但它需要一个in_addr结构参数。我一直看到很多不同的定义,但哪一个是最好的使用 另外,如何将C#IPAddress对象转换为_addrstruct中的 [StructLayoutAttribute(System.Runtime.InteropServices.LayoutKind.Sequential)] public struct in_addr { /// Anonymous1 public Anonymous1 S_un;

我试图使用p/Invoke与本机DLL交互,但它需要一个
in_addr
结构参数。我一直看到很多不同的定义,但哪一个是最好的使用

另外,如何将C#
IPAddress
对象转换为_addrstruct中的

[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;
}
产生于


编辑清除匿名名称。

如果有人感兴趣,请参阅完整代码。它能够将
IPAddress
对象解压到
in_addr
结构中,然后再次解压

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

}
[StructLayout(LayoutKind.Sequential)]
地址中的公共结构{
公开匿名1 S_un;
[StructLayoutAttribute(LayoutKind.Explicit)]
公共结构匿名1{
[FieldOffsetAttribute(0)]
公开匿名2 S_un_b;
[FieldOffsetAttribute(0)]
公开匿名3 S_unw;
[FieldOffsetAttribute(0)]
公共单位地址;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
公共结构匿名2{
公共字节s_b1;
公共字节s_b2;
公共字节s_b3;
公共字节s_b4;
}
[StructLayoutAttribute(LayoutKind.Sequential)]
公共结构匿名3{
公共卫生服务中心s_w1;
公共卫生服务2;
}
public in_addr(IPAddress address):这个(address.GetAddressBytes()){}
公共地址(字节[]地址){
//首先设置此选项,否则会清除其他字段
S_un.S_un_w=新匿名3();
S_un.S_addr=(uint)位转换器.ToInt32(地址,0);
S_un.S_un_b.S_b1=地址[0];
S_un.S_un_b.S_b2=地址[1];
S_un.S_un_b.S_b3=地址[2];
S_un.S_un_b.S_b4=地址[3];
}
/// 
///将in_addr结构解压缩到IPAddress对象
/// 
/// 
公共IP地址ToIPAddress(){
字节[]字节=新的[]{
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
};
返回新的IP地址(字节);
}
}

像JaredPar一样,我仍然不知道如何处理Anonymous3,但这并不重要,因为它无论如何都无法设置。由于它们都具有相同的FieldOffset,因此设置一个字段将清除所有其他字段。不过,它似乎可以工作,所以我不太担心。

有没有办法将它转换为IPAddress对象或从IPAddress对象转换为IPAddress对象?@David,没有内置函数,但编写代码应该不会太糟糕。我对C没有太多经验,所以如果我有这个权利,请告诉我。我使用BitConverter将IPAddress的字节转换为Int32,然后将其分配给S_addr(强制转换为uint)。Anonymous2中的4字节字段(s_b1-s_b4)从IPAddress的字节数组中分配前4个字节。这样行吗?我该如何处理s_w1和s_w2?@David,我在_addr中使用了一段时间,但这看起来是正确的。我不记得s_w1和s_w2是怎么做的,但我认为把它们作为默认值0是正确的。