質問

Cocoa アプリを書いています。アプリケーションにはソケットがあり、ソケットが読み取り可能になるたびに、ソケットからデータを読み取り、データを処理し、それに応じてユーザー インターフェイスを更新する必要があります。読み取りイベントのチェックをメインループに統合したいと考えています。ソケットをメインループにアタッチし、そのソケットが読み取り可能になるたびにメインループがコールバックを呼び出すようにしたいと考えています。

テスト アプリケーションを作成しましたが、何らかの理由で動作しません。

#include <stdio.h>
#include <Foundation/NSAutoReleasePool.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSPort.h>

@interface MyDelegate : NSObject <NSPortDelegate> {
}
- (void)handlePortMessage:(NSPortMessage *)portMessage;
@end

@implementation MyDelegate
- (void)handlePortMessage:(NSPortMessage *)portMessage {
    printf("Haiz\n");
}
@end

int
main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSSocketPort *server = [NSSocketPort alloc];
    MyDelegate *foo = [MyDelegate alloc];
    [server initWithTCPPort: 1234];
    [server setDelegate: foo];
    [[NSRunLoop mainRunLoop] addPort: server forMode: NSDefaultRunLoopMode];
    [[NSRunLoop mainRunLoop] run];
    [pool release];
    return 0;
}

アプリはローカルホスト ポート 1234 でリッスンすることになっており、誰かがサーバーに接続するかサーバーにデータを送信するたびに、アプリはコンソールに「Haiz」を出力することになっています。ただし、アプリはまったく何もしません。ソケットが作成され、ポート 1234 に Telnet 接続できますが、アプリはコンソールに何も出力しません。

私の何が間違っているのでしょうか?

役に立ちましたか?

解決

ドキュメントから:

NSSocketPort オブジェクトは、分散オブジェクト接続のエンドポイントとして使用できます。

あなたがここでやっているのはそういうことではありません。

あなたが欲しいのは どちらか NSファイルハンドル BSD ソケット API からのソケット ファイル記述子の周囲、または ある CFSソケット. 。これにより、ソケットを実行ループに置くことができます。

他のヒント

使いたい NSSocketPort あなたがやっている方法で、しかしその後、 NSFileHandle ソケットでの接続を受け入れます。最初に新しい接続に対して、次にそれらの接続上のデータに対して、期待どおりにメインスレッドでコールバックを取得できます。これを使って オライリーの記事 HTTP に関するものは無視してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top