Я получил программу командной строки Cocoa, в которой я пытаюсь запустить программу NSTask
(tshark
для мониторинга сети) и получать данные из нее в режиме реального времени. Поэтому я делаю
NSFileHandle
позвоните по номеру waitForDataInBackgroundAndNotify
, чтобы отправить уведомления, а затем зарегистрируйте мой класс справки в Центре уведомлений для обработки данных, но в мой класс справки не отправлено ни одного уведомления.
Кто-нибудь имеет представление о том, что может быть не так?
Заранее спасибо
Вот мой код:
#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 (в сообщении waitForDataInBackgroundAndNotify NSFileHandle) :
Вы должны вызывать этот метод из потока с активным циклом выполнения.