C# 在MonoTouch中使用Bonjour NSNetService从NSData获取IP地址?

C# 在MonoTouch中使用Bonjour NSNetService从NSData获取IP地址?,c#,ios,xamarin.ios,bonjour,nsnetservice,C#,Ios,Xamarin.ios,Bonjour,Nsnetservice,我使用iOS上的Xamarin+MonoTouch浏览网络上的web服务器,然后从中下载文件 传递到resolve事件处理程序的NSNetService包含作为NSData的地址。我找不到一个好方法将NSData转换成一个实际的IP地址,然后我可以从中构建URL,即http:///folder/file.htm 这是我的NSNetService.AddressResolved事件处理程序: private void OnServiceResolved(object sender, EventAr

我使用iOS上的Xamarin+MonoTouch浏览网络上的web服务器,然后从中下载文件

传递到resolve事件处理程序的NSNetService包含作为NSData的地址。我找不到一个好方法将NSData转换成一个实际的IP地址,然后我可以从中构建URL,即http:///folder/file.htm

这是我的NSNetService.AddressResolved事件处理程序:

private void OnServiceResolved(object sender, EventArgs args)
{
        NSNetService service = (NSNetService)sender;
        // service.Port is valid.
        // service.HostName is valid.
        // but we want the IP addres, which is in service.Addresses.
        // None of the following four methods works quite right.
        IPAddress address = (IPAddress)service.Addresses [0]; // Cannot convert type NSData to IPAddress
        SocketAddress address2 = (SocketAddress)service.Addresses[0]; // Cannot convert NSData to SocketAddress. A binary copy might work?
        IPHostEntry entry = (IPHostEntry)service.Addresses [0]; // Cannot convert NSData to IPHostEntry
        IPHostEntry entry2 = Dns.GetHostByName (service.HostName); // This kinda works, but is dumb. Didn't we just resolve?
}

在解析事件中,从NSNetService获取服务IP地址的正确方法是什么?

NSNetService.Addresses属性为您提供了
NSData
实例,这些实例必须转换为
IPAddress
(或其他.NET类型)可以消化的内容。例如

MemoryStream ms = new MemoryStream ();
(ns.Addresses [0] as NSData).AsStream ().CopyTo (ms);
IPAddress ip = new IPAddress (ms.ToArray ());
请注意,这可能会返回IPv6地址(或
IPAddress
不接受的格式)。您可能希望迭代所有
地址
,以找到最佳地址

我将研究在Xamarin.iOS的未来版本中添加一种方便的方法

更新

返回
IPAddress
的更完整版本如下所示:

static IPAddress CreateFrom (NSData data)
{
    byte[] address = null;
    using (MemoryStream ms = new MemoryStream ()) {
        data.AsStream ().CopyTo (ms);
        address = ms.ToArray ();
    }
    SocketAddress sa = new SocketAddress (AddressFamily.InterNetwork, address.Length);
    // do not overwrite the AddressFamily we provided
    for (int i = 2; i < address.Length; i++)
        sa [i] = address [i];
    IPEndPoint ep = new IPEndPoint (IPAddress.Any, 0);
    return (ep.Create (sa) as IPEndPoint).Address;
}
静态IP地址CreateFrom(NSData数据)
{
字节[]地址=空;
使用(MemoryStream ms=newmemoryStream()){
data.AsStream().CopyTo(ms);
地址=ms.ToArray();
}
SocketAddress sa=新的SocketAddress(AddressFamily.InterNetwork,address.Length);
//不要覆盖我们提供的AddressFamily
for(int i=2;i
谢谢。如果能在Xamarin轻松转换,那将是一件美妙的事情。:)用于解析支持IPv6和IPv4的NSData的代码段: