3

iOS で Xamarin + MonoTouch を使用して、ネットワーク上の Web サーバーを参照し、そこからファイルをダウンロードしています。

resolve イベント ハンドラに渡される 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 アドレスを取得する正しい方法は何ですか?

4

1 に答える 1

4

このNSNetService.Addressesプロパティは、消化できるもの (または他の .NET 型)NSDataに変換する必要があるインスタンスを提供します。IPAddress例えば

MemoryStream ms = new MemoryStream ();
(ns.Addresses [0] as NSData).AsStream ().CopyTo (ms);
IPAddress ip = new IPAddress (ms.ToArray ());

これにより、IPv6 アドレス (またはIPAddress受け入れられない形式) が返される可能性があることに注意してください。最良Addressesのものを見つけるために、すべてを繰り返したいと思うかもしれません。

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;
}
于 2014-02-22T17:45:05.033 に答える