c# - 在 MonoTouch 中使用 Bonjour NSNetService 来自 NSData 的 IP 地址?

标签 c# ios xamarin.ios bonjour nsnetservice

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

传递给解析事件处理程序的 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 地址的正确方法是什么?

最佳答案

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 的 future 版本中添加一种便捷方法。

更新

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

关于c# - 在 MonoTouch 中使用 Bonjour NSNetService 来自 NSData 的 IP 地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743679/

相关文章:

c# - F#:从 ViewController 中的 Storyboard 访问 UI 元素?

javascript - Web API Controller 不尊重 CORS 来源

c# - 为什么 FxCop 将 GC.KeepAlive() 标记为违规?

c# - 有了区域,我可以轻松地将我的应用程序分解成不同的模块吗?

ios - 奇怪但易于理解的错误... UIActivityIndi​​catorView stopAnimating 不起作用

ios - 键盘隐藏通知调用多次

c# - 内存泄漏 : TimerCallbacks objects referenced by root

ios - 根据区域设置格式化部分日期

iphone - 单点触摸旋转纵向/横向 View

ios - 将 Crashlytics 构建脚本与 Xamarin.iOS 集成