首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoTouch和CFStream应用编程接口的问题

MonoTouch和CFStream应用编程接口的问题
EN

Stack Overflow用户
提问于 2012-09-27 22:13:30
回答 2查看 928关注 0票数 2

我目前正在开发一个需要通过套接字连接与MQTT服务器通信的应用程序。由于在从WiFi网络切换到3G网络时,System.Net.Sockets应用程序接口往往表现不佳(实际上这种情况经常发生),我决定尝试一下CFStream应用程序接口。在这样做的过程中,我遇到了一些问题,如下所示。

当我在两个流中的任何一个上调用CreatePairWithSocketToHost ()时,使用CreatePairWithSocketToHost创建一对流就会使应用程序崩溃。

代码语言:javascript
复制
CFStream.CreatePairWithSocketToHost(GetEndPoint(), out mReadStream, out mWriteStream);
mReadStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);
mWriteStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);
mReadStream.Open();
mWriteStream.Open();

无论我是否调用EnableEvents(),都会发生崩溃。例外情况是:

代码语言:javascript
复制
[ERROR] FATAL UNHANDLED EXCEPTION: MonoTouch.CoreFoundation.CFException: The operation couldn’t be completed. Cannot allocate memory
  at MonoTouch.CoreFoundation.CFStream.CheckError () [0x0000f] in /Developer/MonoTouch/Source/monotouch/src/shared/CoreFoundation/CFStream.cs:236 
  at MonoTouch.CoreFoundation.CFStream.Open () [0x00040] in /Developer/MonoTouch/Source/monotouch/src/shared/CoreFoundation/CFStream.cs:248 
  at TestCfNework.RootViewController.TestCreatePairToHost () [0x00041] in /Users/adrian/Projects/TestCfNework/TestCfNework/RootViewController.cs:79 
  at TestCfNework.RootViewController.ViewDidLoad () [0x00000] in /Users/adrian/Projects/TestCfNework/TestCfNework/RootViewController.cs:24 
  at MonoTouch.UIKit.UIWindow.MakeKeyAndVisible () [0x00008] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIWindow.g.cs:124 
  at TestCfNework.AppDelegate.FinishedLaunching (MonoTouch.UIKit.UIApplication app, MonoTouch.Foundation.NSDictionary options) [0x0002e] in /Users/adrian/Projects/TestCfNework/TestCfNework/AppDelegate.cs:32 
  at MonoTouch.UIKit.UIApplication.Main (System.String[] args, System.String principalClassName, System.String delegateClassName) [0x0004c] in /Developer/MonoTouch/Source/monotouch/src/UIKit/UIApplication.cs:38 
  at TestCfNework.Application.Main (System.String[] args) [0x00000] in /Users/adrian/Projects/TestCfNework/TestCfNework/Main.cs:17 

通过首先创建并连接一个CreatePairWithSocket来使用CFSocket创建一对流,允许Open()继续进行而不会崩溃,但CanAcceptBytesEvent永远不会触发,CanAcceptBytes()始终为false,并且任何写入尝试都会因超时而失败。

代码语言:javascript
复制
mSocket = new CFSocket(AddressFamily.InterNetwork, 
    SocketType.Stream, 
    ProtocolType.Tcp, 
    CFRunLoop.Current);
mSocket.ConnectEvent += delegate {
    Console.WriteLine("Socket connected");

    CFStream.CreatePairWithSocket(mSocket, out mReadStream, out mWriteStream);
    mReadStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);
    mWriteStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);

    mReadStream.Open();
    mWriteStream.Open();

    mWriteStream.CanAcceptBytesEvent += delegate {
        Console.WriteLine("Write stream can now accept data");
    };
    mWriteStream.ErrorEvent += delegate {
        Console.WriteLine(mWriteStream.GetError());
    };
};
mSocket.Connect(GetEndPoint(), 0);

使用CreatePairWithPeerSocketSignature创建一对流是唯一实际产生一对我可以使用的流的方法:打开时不会崩溃,并且允许我分别对其进行写入和读取。

API在模拟器和实际设备上都是这样运行的。那么,这是我做错了什么吗?这是一个MonoTouch问题吗?这是CFStream应用编程接口本身的错误吗?

MonoTouch版本: 6.0.1。XCode版本: 4.5。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-29 16:08:00

我用MonoMac / MonoTouch编写了大部分CFNetwork代码,因此我希望能够在这方面对您有所帮助:-)

你的代码在我看来没问题。它在MonoMac (Mac上的独立Cocoa应用程序)上运行得很好,但我在MonoTouch上看到了同样的问题。打开读取流有时有效,有时无效,打开写入流总是失败。

CFStream.CreatePairWithSocketToHost()调用CFStreamCreatePairWithSocketToCFHost()

添加新的重载版本后:

代码语言:javascript
复制
    public static void CreatePairWithSocketToHost (string host, int port,
                                                   out CFReadStream readStream,
                                                   out CFWriteStream writeStream)

它调用CFStreamCreatePairWithSocketToHost(),现在运行得很好。

我刚刚看了一下,发现了问题,很快就会有一个解决方案。

关于您的第二个问题,CFSocket应用编程接口在内部遇到相同的代码路径,因此它也会受到此错误的影响。

票数 1
EN

Stack Overflow用户

发布于 2012-09-28 04:44:45

要唤醒3G网络,您需要使用:

http://iosapi.xamarin.com/?link=T%3aMonoTouch.ObjCRuntime.Runtime%2fM%2fStartWWAN

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12623429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档