2014-02-13 31 views
1

我在iOS上使用Xamarin + MonoTouch瀏覽網絡上的Web服務器,然後我可以從中下載文件。在MonoTouch中使用Bonjour NSNetService的NSData的IPAddress?

傳遞到解析事件處理程序的NSNetService包含地址作爲NSData。我找不到一個很好的方法來將該NSData轉換爲一個實際的IP地址,然後我可以建立一個URL,即http:// < IPAddress> /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地址的正確方法是什麼?

回答

3

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不會接受)。您可能需要迭代所有Addresses以查找最好的之一。

我會考慮在未來版本的Xamarin.iOS中添加一種方便的方法。

UPDATE

更完整的版本,返回一個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; 
} 
+1

謝謝。在Xamarin中輕鬆轉換會很棒。 :) –