Ios 关闭WiFi后,NSStream写入套接字不会出现错误。为什么?

Ios 关闭WiFi后,NSStream写入套接字不会出现错误。为什么?,ios,iphone,sockets,nsstream,Ios,Iphone,Sockets,Nsstream,你好 我在iPhone上为PC上运行的应用程序编写自定义控制器。我使用标准编码在ios客户端上设置并打开套接字并写入/接收数据。在我去一个wifi连接薄弱的地区之前,一切都很好,iPhone或PC都失去了连接。我在iPhone上添加了一个wifi连接测试,使用的是可达性,效果与预期一致。我假设使用与NSStream相关的三种可能的错误检查方法之一可以让我知道连接的远程端(即PC)是否有问题 我首先发送了一条[OutputStreamStatus]消息,希望在我关闭电脑上的wifi适配器时收到一条

你好

我在iPhone上为PC上运行的应用程序编写自定义控制器。我使用标准编码在ios客户端上设置并打开套接字并写入/接收数据。在我去一个wifi连接薄弱的地区之前,一切都很好,iPhone或PC都失去了连接。我在iPhone上添加了一个wifi连接测试,使用的是
可达性
,效果与预期一致。我假设使用与
NSStream
相关的三种可能的错误检查方法之一可以让我知道连接的远程端(即PC)是否有问题

我首先发送了一条
[OutputStreamStatus]
消息,希望在我关闭电脑上的wifi适配器时收到一条
NSStreamStatusError
代码。我收到的是一条
NSStreamStatusOpen
代码

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

第三次尝试是显式查看
NSStream
委托接收的代码。大多数时候,它是可用的,但从来没有出现过

有人知道为什么吗?
NSStream
是否与
可达性
(旧版本)类似&只要手机有连接,您是否满意

谢谢你的见解


RB

偶尔,尤其是使用套接字时,流可能会遇到错误,从而阻止流数据的进一步处理。通常,错误表示流的一端缺少某些内容,例如远程主机崩溃或正在流的文件被删除。当大多数错误发生时,流的客户端除了向用户报告错误外,还可以做一些事情。虽然报告了错误的流对象可以在关闭前查询其状态,但不能将其重新用于读或写操作

NSStream
NSOutputStream
类会在错误以多种方式发生时通知您:

1.如果流对象被安排在运行循环中,则该对象会在
流:handleEvent:message
中向其委托报告
nsstreamventerrocurred
事件

2.客户端可以随时向流对象发送
streamStatus
消息,查看是否返回
NSStreamStatusError

3.如果您试图通过发送
write:maxLength:
对象来写入
NSOutputStream
对象,并且该对象返回-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 ....
    }
}

有关更多详细信息:

Ramshad:Thx。用于文档的上载/链接。从问题中可以看出,我尝试了所有三种建议的方法,但没有一种给我错误,尽管我通过关闭wifi连接模拟了“远程主机崩溃”。还是没有人更聪明。铷