在C#中使用in_addr

Dav*_*own 0 c# pinvoke struct ip-address in-addr

我正在尝试使用P/Invoke与本机DLL进行交互,但它需要一个in_addrstruct参数.我一直看到很多不同的定义,但最好用哪个?

另外,如何将C#IPAddress对象转换为in_addr结构?

Dav*_*own 5

如果有人有兴趣,这里是完整的代码.它能够将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);
    }

}
Run Code Online (Sandbox Code Playgroud)

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