加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C# – 将指向sockaddr结构的IntPtr转换为IPAddress

发布时间:2020-12-16 01:55:44 所属栏目:百科 来源:网络整理
导读:从P / Invoked本机函数,我得到一个指向 sockaddr 结构的 IntPtr .如何将其转换为 IPAddress ? 谢谢! 解决方法 由于您无法直接将sockaddr类型编组为IPAddress类型,因此您必须首先将 a managed struct out of it编组为: [StructLayout(LayoutKind.Sequentia
从P / Invoked本机函数,我得到一个指向 sockaddr结构的 IntPtr.如何将其转换为 IPAddress

谢谢!

解决方法

由于您无法直接将sockaddr类型编组为IPAddress类型,因此您必须首先将 a managed struct out of it编组为:

[StructLayout(LayoutKind.Sequential)]
internal struct sockaddr_in
{
    internal EnumLib.ADDRESS_FAMILIES sin_family;
    internal ushort sin_port;
    internal in_addr sin_addr;
    [MarshalAs(UnmanagedType.ByValArray,SizeConst = 8)] internal byte[] sin_zero;

    internal static sockaddr_in FromString(string host,int port)
    {
    var sockaddr = new sockaddr_in();
    var lpAddressLength = Marshal.SizeOf(sockaddr);
    WSAStringToAddress(host + ":" + port,EnumLib.ADDRESS_FAMILIES.AF_INET,IntPtr.Zero,ref sockaddr,ref lpAddressLength);
    return sockaddr;
    }
}

然后,您可以使用Marshal.PtrToStructure从IntPtr获取sockaddr_in类型,如下所示:

(sockaddr_in)Marshal.PtrToStructure(address,typeof(sockaddr_in));

之后,从刚刚检索到的数据创建新的IPAddress对象应该相当简单.

您可以在上面的示例中找到EnumLib中包含的ADDRESS_FAMILIES枚举:http://pastie.org/8103489

最初在pinvoke.net上有更多的结构成员,如果你对它们感兴趣,只有take a look here但是我认为在这种特定情况下你根本不需要它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读