2011-05-05 57 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