ping在monotouch

我想知道为什么一些monotouchfunction在模拟器中运行良好,但在真实设备上失败? 相同的Ping类。 它从模拟器完美工作,但在设备上失败。 有什么不同? 有没有办法让它在设备上工作?

另外,我已经find了关于如何在mac OS中实现ping的文章: http : //developer.apple.com/library/mac/#samplecode/SimplePing/Listings/SimplePing_m.html#//apple_ref/doc/uid / DTS10000716-SimplePing_m-DontLinkElementID_5

有可能将这个代码移植到monotouch? 说实话,我还没有尝试,如果它在iOS上工作,但我没有看到任何东西,为什么它不会在那里工作。

PS。 我知道Reachability类,是的,我使用它在我的项目,而不是平!

这很可能是iOS允许你做的一个问题。

这是来自一个尝试使用原始套接字实现ping的人,并且遇到了iOS限制。

最初的bugreport指出:“做一个ping需要一个linux内核function(capget)或设备上不存在的ping二进制文件”。 换句话说:根访问。

这是一个解决方法,但它不是一个平实施。

也就是说,看起来有人试图将SimplePing示例移植到iOS上,所以也许终究有可能 – 但它并不是优先考虑的(Reachability类毕竟是可用的)。

MonoTouch的SimplePing现在可以在这里find。

https://github.com/theonlylawislove/MonoTouch.SimplePing

简单地把这个git repo作为子模块添加到你的项目,然后添加“现有的项目”,并添加“MonoTouch.SimplePing”到你的项目中。 有一个小的帮助器类可以使“SimplePingHelper”的“MonoTouch.SimplePing.Test”项目变得更容易一些。

然后使用下面的代码。

SimplePingHelper.Ping ( "192.168.5.77", 1000, () => { NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => { var alertView = new UIAlertView ("Response", "Success", null, null, new string[] { "Ok" }); alertView.Show (); })); }, () => { NSThread.MainThread.BeginInvokeOnMainThread (new NSAction (() => { var alertView = new UIAlertView ("Response", "Failure", null, null, new string[] { "Ok" }); alertView.Show (); })); }); 

这个解决scheme在模拟器和我testing过的每一个设备上工作。

不要使用互联网上发现的任何“RawSocket”黑客。 它充满了asynchronous代码的错误,并在一些设备上工作,而不是其他问题。 把我的头发拉出来后,我想我会移植SimplePing项目,因为我发现它实际上工作。

请享用!

我想知道为什么一些monotouchfunction在模拟器中运行良好,但在真实设备上失败?

MonoTouch询问操作系统,例如在这种情况下的networking堆栈,进行出价。 iOS模拟器和设备之间允许操作系统不同(并且不同),并且在运行时也有不同的performance。

有什么不同?

只是为了重新强调Apple SDK提供iOS 模拟器的主要事实不是 模拟器 。 它甚至不尝试模仿设备的大部分限制。 例如:

  • 执行x86代码,而不是ARM代码(就像Android模拟器所要求的那样);

  • 允许JIT'ing(这是很好的,因为它允许MonoTouch真正快速地在模拟器下进行debugging)。 这是不允许的(甚至可能)在设备上,我们必须使用AOT编译;

  • 提供对文件系统的完全访问权限(与当前用户可以读取的一样多);

  • 不提供对某些特定设备function(例如加速计)的模拟支持;

  • 名单继续…

其中一些差异是很大的(比运行ARM代码的仿真器要快得多),而另外一些则可能在某些情况下非常有限(例如缺乏对硬件function的支持)。