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但是我认为在这种特定情况下你根本不需要它们. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |