【问题标题】:Execution stopped at readDataToEndOfFile method in iOS执行在 iOS 中的 readDataToEndOfFile 方法处停止
【发布时间】:2014-04-08 06:17:56
【问题描述】:

“readDataToEndOfFile”方法执行后应用程序执行停止/挂起。请找到以下代码,如何解决此问题

    - (void)viewDidLoad
{
    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.
    NSTask *task = [[NSTask alloc] init];
    [task setLaunchPath: @"/usr/sbin/tcpdump"];
    [task setArguments: [[NSArray alloc] initWithObjects:@"-l", @"-i",@"en1",@"-A",@"-vvv",@"host",@"www.facebook.com", nil]];

    NSPipe *pipe= [NSPipe pipe];
    [task setStandardOutput: pipe];

    NSFileHandle *fileHandle = [pipe fileHandleForReading];

    [task launch];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(receivedData:) name:NSFileHandleDataAvailableNotification object:fileHandle];
    [fileHandle waitForDataInBackgroundAndNotify];

}


- (void)receivedData:(NSNotification *)notif {

    NSFileHandle *fileHandle=notif.object;
    NSData *data = [fileHandle readDataToEndOfFile];

    NSString *output = [[NSString alloc] initWithData: data encoding: NSUTF8StringEncoding];
    NSLog(@"result: %@", output);
}

【问题讨论】:

  • 你能定义连续流的“结束”吗?您必须终止 tcpdump 部分才能停止。
  • @borrrden:我添加了-c 10 以在收到 10 个数据包后退出,代码如下,如何在 30 秒后退出而不是 10 个数据包?
  • [task setArguments: [[NSArray alloc] initWithObjects:@"-c",@"10", @"-i",@"en1",@"-A",@"- vvv",@"host",@"www.facebook.com", nil]];
  • 检查 man 的 tcpdump。或者尝试在 30 秒后杀死 NSTask。

标签: ios nstask nsfilehandle


【解决方案1】:

尝试使用availableData 而不是readDataToEndOfFile

NSFileHandle *fileHandle=notif.object;
NSData *data = [fileHandle availableData];
if (data)
{
// do something
}

【讨论】:

    【解决方案2】:

    这是旧的,似乎是孤立的,但这里有一些可能对发现自己的人有用的信息。

    与此问题相关的大部分基金会已经发展。我没有尝试解决上面的确切问题。我怀疑它涉及waitUntilExit() 方法。

    NSTask 现在是 Process 类(init 方法的文档说它返回一个 NSTask)。

    这是上述在 Swift 中的当前实现。

    func tcDump() throws -> String {
        let task = Process()
        task.executableURL = URL(fileURLWithPath: "/usr/sbin/tcdump")
        task.arguments = ["-1", "-i", "en1", "-A", "-vvv", "host", "www.facebook.com"]
        let pipe = Pipe()
        task.standardOutput = pipe
        
        let fileHandle = pipe.fileHandleForReading
        try task.run()
        task.waitUntilExit()
        let data = fileHandle.readDataToEndOfFile()
        
        if let output = String(data: data, encoding: .utf8) {
            return output
        } else {
            FileHandle.standardError.write("problem with tcdump output\n".data(using:.utf8)!)
            throw NSError(domain: "error", code: 1, userInfo: nil)
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-14
      • 2013-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-02
      • 1970-01-01
      相关资源
      最近更新 更多