#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, поскольку мой сервис переместился на веб-сайт вместо размещения в приложении. Но в любом случае спасибо за вашу помощь.