Как разрешить адрес с помощью MonoTouch.Основание.NSNetService?

#mono #xamarin.ios

#mono #xamarin.ios

Вопрос:

В настоящее время я разрабатываю приложение для iPad. Я хочу, чтобы это связывалось с приложением Windows c #, использующим WCF, и обнаруживалось через BonJour.

Я уже создал часть Windows / c #, используя библиотеку Mono.ZeroConf, и протестировал, что она работает так, как предполагалось в Windows.

Теперь, когда я пытаюсь заставить свое приложение MonoTouch открыть приложение Windows, все идет нормально, пока мне не понадобится разрешить адрес. Я просто не могу понять, что не так.

У меня есть следующий код в моем приложении для iPad.

 NSNetServiceBrowser browser = new NSNetServiceBrowser();
browser.FoundService  = delegate(object sender, NSNetServiceEventArgs e){
    e.Service.AddressResolved  = delegate(object service, EventArgs e1){

        //No matter how I treat the Bytes here it resolves to me as 8.135.207.208
        //When it was supposed to resolve to some 172.x.x.x ip. 
        long address = ((NSNetService)service).Addresses[0].Bytes.ToInt64();
    };
    e.Service.Resolve();
};
browser.SearchForServices("_myService._tcp", "local");
  

Итак, мой вопрос в том, как я должен обрабатывать объекты NSData в массиве адресов, чтобы разрешить их правильно.

Я пробовал искать, но, похоже, не могу понять.

Все остальные свойства разрешенной службы верны, такие как имя, порт и т.д.

Я надеюсь, что некоторые из вас были здесь и могут предоставить мне ответ.

С наилучшими пожеланиями /Anders

Ответ №1:

Данные в адресах, которые вы получаете, являются NSData в NSArray. В описании самого делегата говорится, что это коллекция объектов sockaddr (обычная структура C). Так что определенно не Int64 как есть, а указатель на объект sockaddr.

Тогда способ, которым это делается в MT, немного отличается. Вы получили делегирование для NSNetService, и теперь вам нужно дождаться, пока служба разрешит адрес, это делается другим решением.

Обычно я сохраняю NSNetService, возвращенный делегатом NSNetServiceBrowser, а затем жду, пока адрес не будет разрешен, как только это будет сделано, именно тогда я использую службу, поскольку она уже инициализирована, и меня не волнует сам адрес.

Комментарии:

1. Чтобы разобраться во всем этом. Я хочу использовать адрес nsnetservice в качестве аргумента для службы WCF. Для этого я хотел бы использовать IP, но, конечно, могу попробовать использовать DNS-имя объекта NSNetService. Я полагаю, это то, что вы предлагаете. Или что вы подразумеваете под «Я использую службу, поскольку она уже инициализирована, и меня не волнует сам адрес»

2. Когда вызывается делегат AddressResolved, фактический NSService готов к использованию. Я использую свойства имени хоста и порта, чтобы создать NSUrl для NSURLConnection и затем NSURLRequest.

3. Хорошо, я буду ожидать, что это сработает. На самом деле я выбрал другой подход и отказался от Bonjour discovery, поскольку мой сервис переместился на веб-сайт вместо размещения в приложении. Но в любом случае спасибо за вашу помощь.