私はNSTask
プログラム(ネットワークを監視するためにtshark
)を実行し、リアルタイムでそのデータを取得しようとするココアコマンドラインプログラムを取得しました。そこで、私は NSFileHandle を作成し、通知を送信してから、ヘルプセンターを通知センターに登録してデータを処理しますが、ヘルプクラスに通知は1つも送信されません。waitForDataInBackgroundAndNotify
通知を使用してNSTaskからリアルタイムでデータを取得することができません
誰かが間違っている可能性のあるアイデアはありますか?ここでは、事前
で
おかげで私のコードです:
#import <Foundation/Foundation.h>
#import <string>
#import <iostream>
@interface toff : NSObject {}
-(void) process:(NSNotification*)notification;
@end
@implementation toff
-(void) process:(NSNotification*)notification{
printf("Packet caught!\n");
}
@end
int main (int argc, const char * argv[]){
@autoreleasepool {
NSTask* tshark = [[NSTask alloc] init];
NSPipe* p = [NSPipe pipe];
NSFileHandle* read = [p fileHandleForReading];
toff* t1 = [[toff alloc] init];
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[read waitForDataInBackgroundAndNotify];
[nc addObserver:t1 selector:@selector(process:) name:nil object:nil];
printf("Type 'stop' to stop monitoring network traffic.\n");
[tshark setLaunchPath:@"/usr/local/bin/tshark"];
[tshark setStandardOutput:p];
[tshark launch];
while(1){
std::string buffer;
getline(std::cin, buffer);
if(buffer.empty()) continue;
else if(buffer.compare("stop") == 0){
[tshark interrupt];
break;
}
}
//NSData* dataRead = [read readDataToEndOfFile];
//NSLog(@"Data: %@", dataRead);
//NSString* stringRead = [[NSString alloc] initWithData:dataRead encoding:NSUTF8StringEncoding];
//NSLog(@"Output: %@", stringRead);
}
return 0;
}
編集:私は、コードのコメントセクションのコメントを解除し、すべてのその通知のものを削除すると、必要なすべてのデータは、後にファイルハンドルから抽出されていますタスクフィニッシュ。
私のプログラムは「コマンドラインツール」なので、実際に問題が解決できないのではないかと思っていたので、ループが実行されているかどうかわかりません。AppleのマニュアルにはNSFileHandleのwaitForDataInBackgroundAndNotifyメッセージ):
アクティブな実行ループを持つスレッドからこのメソッドを呼び出す必要があります。
本当にその 'addObserver:selector:name:object:'メッセージをより具体的にするべきです。あなたは現在、NSFileHandleReadCompletionNotification'通知だけでなく* any *通知にサインアップしています。 –
実行ループは必要に応じて暗黙的に作成されるため、「実行ループがある」と思っても安全に実行できますが、実行する必要があります。アプリケーションは実行ループを実行するので、実行する必要があるのはリターンですが、コマンドラインツールでは実行ループを自分で実行する必要があります。 NSFileHandleを使用して標準入力から読み込むことをお勧めします。また、タスクが終了するまで実行ループを実行するために私が答えて言ったことを実行することをお勧めします。 –
@PeterHosey良いアイデア - ありがとう。私はこれをやろうとしたが、うまくいかなかった。だから私は単純な、停止を省略し、[これは(http://pastebin.com/qnhaUAjp)(私はまた、NSFileHandleによって渡されたデータが何とかバッファリングされて気づいた - 私が1のコメントを外すと、パケットが無制限に捕らえられたと書いています。最後に、データを抽出してコメントを外してみると、_2 -5_それはしばらく待って、行_2と3_を書き込んだ後、フリーズします。いいえ、クラッシュはありません。エラーはありません。データを抽出しないでください。 – user1023979