NSStream委托不会触发错误

时间:2016-01-05 15:52:43

标签: ios objective-c sockets tcp delegates

我正在努力解决NSStream代表的问题。

我的应用创建并打开10个并发TCP客户端,并连接到我控制的设备中的10个TCP服务器。 我正在创建10个插槽,每个插槽都有自己独特的输入和输出流。 它们都反馈到一个流委托来处理流事件。

我可以毫无问题地在所有10个插槽上进行连接和通信。

但是当我拔掉一台或多台服务器时,我在iPad上的连接仍然显示其状态已建立,[outputStream status]消息返回2.

我希望当服务器断开连接时,流会显示错误事件,但这似乎并没有发生。

这是我通过将多个流连接到单个委托来做错事还是还有其他一些更基本的问题?

我的套接字创建示例,用于设置委托:

-(void)connectToHub0 {  
    launchflag = 1;  

    NSLog(@"trying to connect to hub 0");  

    /  
    UInt32 port;  
    port = 40000;  

    launchTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector (launchTimeOut:) userInfo:nil repeats:NO];  

    Hub *currentHub = [Hubs objectAtIndex:0];  

    /  
    CFReadStreamRef readStream;  
    CFWriteStreamRef writeStream;  
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)currentHub.ipAddress, port, &readStream, &writeStream);  
    inputStream = (__bridge NSInputStream *)readStream;  
    outputStream = (__bridge NSOutputStream *)writeStream;  

    [inputStream setDelegate:self];  
    [outputStream setDelegate:self];  

    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];  
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];  

    [inputStream open];  
    [outputStream open];  
}

代理人在我的viewController.m中设置为:

@interface viewController()<NSStreamDelegate>

1 个答案:

答案 0 :(得分:0)

这是TCP套接字的正常行为。检测此类断开连接的一种方法是使用 keep-alive 数据包作为网络协议的一部分。

有关更详细的答案,请参阅this interesting article