首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPAddress从NSData使用Bonjour NSNetService在MonoTouch?

IPAddress从NSData使用Bonjour NSNetService在MonoTouch?
EN

Stack Overflow用户
提问于 2014-02-13 01:51:53
回答 1查看 850关注 0票数 3

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

传递给“解决”事件处理程序的NSNetService包含作为NSData的地址。我找不到一种很好的方法将这个NSData转换成一个实际的IP地址,然后我可以从它构建一个网址,即http:// < IPAddress >/IPAddress/file.htm。

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

代码语言:javascript
复制
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地址的正确方法是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-22 17:45:05

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

代码语言:javascript
复制
MemoryStream ms = new MemoryStream ();
(ns.Addresses [0] as NSData).AsStream ().CopyTo (ms);
IPAddress ip = new IPAddress (ms.ToArray ());

请注意,这可以返回IPv6地址(或IPAddress不接受的格式)。您可能需要迭代所有的Addresses以找到最好的一个。

我将考虑在Xamarin.iOS的未来版本中添加一种方便的方法。

更新

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

代码语言:javascript
复制
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;
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21743679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档