2

私は現在、ソケット接続を介してMQTTサーバーと通信する必要があるアプリケーションを開発しています。System.Net.Sockets APIは、WiFiネットワークから3Gネットワ​​ークに切り替えるときに誤動作する傾向があるため(これは実際には非常に多く発生します)、CFStreamAPIを試してみることにしました。そうすることで、私は次のようないくつかの問題に遭遇しました。

ストリームのペアを作成すると、CreatePairWithSocketToHostいずれかのストリームでOpen()を呼び出すとすぐに、アプリケーションがクラッシュします。

CFStream.CreatePairWithSocketToHost(GetEndPoint(), out mReadStream, out mWriteStream);
mReadStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);
mWriteStream.EnableEvents(CFRunLoop.Current, CFRunLoop.CFDefaultRunLoopMode);
mReadStream.Open();
mWriteStream.Open();

電話をかけるかどうかに関係なく、クラッシュが発生しますEnableEvents()。例外は次のとおりです。

[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であり、書き込みの試行はタイムアウトで失敗します。

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 API自体のバグですか?

MonoTouchバージョン:6.0.1。XCodeバージョン:4.5。

4

2 に答える 2

1

私はほとんどのCFNetworkコードをMonoMac/MonoTouchで書いたので、うまくいけばこれであなたを助けることができるはずです:-)

あなたのコードは私には大丈夫に見えます。MonoMac(Mac上のスタンドアロンCocoaアプリケーション)では問題なく動作しますが、MonoTouchでも同じ問題が発生します。読み取りストリームを開くと機能する場合と機能しない場合があり、書き込みストリームを開くと常に失敗します。

CFStream.CreatePairWithSocketToHost()を呼び出しますCFStreamCreatePairWithSocketToCFHost()

新しいオーバーロードバージョンを追加した後:

    public static void CreatePairWithSocketToHost (string host, int port,
                                                   out CFReadStream readStream,
                                                   out CFWriteStream writeStream)

これを呼び出すとCFStreamCreatePairWithSocketToHost()、これは現在正常に機能しています。

私はこれを見て問題を見つけました。まもなく修正される予定です。

2番目の問題については、CFSocket APIが内部で同じコードパスにヒットしているため、このバグの影響も受けます。

于 2012-09-29T08:07:59.513 に答える
0

3Gネットワ​​ークをウェイクアップするには、次を使用します。

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

于 2012-09-27T20:44:44.827 に答える