2011-05-05 32 views
1

我目前正在開發一個iPad應用程序。我希望這與使用WCF的Windows c#應用程序進行通信,並通過BonJour進行發現。如何使用MonoTouch.Foundation.NSNetService解析地址?

我已經使用Mono.ZeroConf庫製作了windows/c#部分,並測試了它在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對象來解決它們的問題。

我試過尋找,但似乎無法弄清楚。

的解決服務的所有其他屬性是正確的,如姓名,端口等

我希望你們中的一些已經在這裏,並能提供我一個答案。

問候 /安德斯

回答

0

在收到地址的數據是在NSData的一個NSArray。代表本身的描述說它是sockaddr對象的集合(純C結構)。所以絕對不是一個Int64,而是一個指向sockaddr對象的指針。

它在MT中完成的方式有些不同。您收到了NSNetService的委託,現在您必須等待該服務解決該地址,這是通過另一個解決方案完成的。

我通常存儲由NSNetServiceBrowser委託返回的NSNetService,然後等到地址解析完成,一旦完成,那麼當我使用服務,因爲它已經被初始化,我不關心地址本身。

+0

爲了得到這一切。我想使用nsnetservice的地址作爲WCF服務的參數。爲此,我想使用IP,但可以嘗試使用NSNetService對象的DNS名稱。我想這就是你的建議。或者,「我使用服務,因爲它已經初始化,我不在意地址本身」。 – ankhansen 2011-05-10 08:58:26

+0

當AddressResolved委託被調用時,實際的NSService已準備好使用。 然後,我使用HostName和Port屬性爲NSUrlConnection和NSUrlRequest創建NSUrl。 – 2011-05-10 09:42:57

+0

好吧,我會期待這個工作。實際上,我採取了另一種方法,並且由於我的服務移動到網站而不是託管在應用程序中,因此放棄了Bonjour發現。但是,無論如何感謝您的幫助。 – ankhansen 2011-06-08 06:52:38