NSStream写入套接字在WiFi关闭时没有错误。为什么?

时间:2014-01-21 18:25:40

标签: ios iphone sockets nsstream

美好的一天,

我正在iPhone上为PC上运行的应用程序编写自定义控制器。我正在使用标准编码来设置&打开插座&在我的ios客户端上写/接收数据。一切顺利,直到我去了一个无线连接弱的区域,其中iPhone或PC失去了连接。我使用Reachability在iPhone上为wifi连接添加了测试,该测试按预期工作。我假设使用与NSStream相关联的三种可能的错误检查方法之一会让我知道连接的远程端(即PC)是否有问题。

我开始发送[outputStream streamStatus]消息,希望在我关闭PC上的wifi适配器时获得NSStreamStatusError代码。我得到的是一个NSStreamStatusOpen代码。

第二次尝试是检查来自write: maxLength:的-1返回码。相反,这给出了成功发送的字节数(据说)。

第三次尝试是明确查看NSStream委托接收的代码。大部分时间都是NSStreamEventHasSpaceAvailable,但绝不是NSStreamEventErrorOccurred

有谁知道为什么? NSStreamReachability(旧版本)相似吗?只要手机有连接就很开心吗?

感谢您的任何见解。

RB

1 个答案:

答案 0 :(得分:2)

有时,特别是对于套接字,流可能会遇到阻止进一步处理流数据的错误。通常,错误表示在流的一端没有某些东西,例如远程主机的崩溃或正在流式传输的文件的删除。除了向用户报告错误之外,当发生大多数错误时,流的客户端可以执行一些操作。虽然报告错误的流对象可以在关闭之前查询状态,但不能重复用于读取或写入操作。

NSStreamNSOutputStream类会以多种方式通知您是否发生错误:

1.如果在运行循环中调度流对象,则对象会在NSStreamEventErrorOccurred中向其委托报告stream:handleEvent: message事件。

2.任何时候,客户端都可以向流对象发送streamStatus消息,看它是否返回NSStreamStatusError

3.如果您尝试通过发送NSOutputStream来写入write:maxLength:对象并返回-1,则表示发生了写入错误。

确定流对象遇到错误后,可以使用streamError消息查询对象以获取有关错误的更多信息(以NSError对象的形式)。接下来,告知用户有关错误的信息。清单1显示了运行循环调度的流对象的委托如何处理错误。

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode {
    NSLog(@"stream:handleEvent: is invoked...");

    switch(eventCode) {
        case NSStreamEventErrorOccurred:
        {
            NSError *theError = [stream streamError];
            NSAlert *theAlert = [[NSAlert alloc] init];
            [theAlert setMessageText:@"Error reading stream!"];
            [theAlert setInformativeText:[NSString stringWithFormat:@"Error %i: %@",
                [theError code], [theError localizedDescription]]];
            [theAlert addButtonWithTitle:@"OK"];
            [theAlert beginSheetModalForWindow:[NSApp mainWindow]
                modalDelegate:self
                didEndSelector:@selector(alertDidEnd:returnCode:contextInfo:)
                contextInfo:nil];
            [stream close];
            [stream release];
            break;
        }
        // continued ....
    }
}

有关详情:Developer.Apple - Handling Stream Errors