Lorenzo Ang
Lorenzo Ang

Reputation: 1318

NSStream refusing to reconnect once disconnected (Getting "error 61 - Connection Refused")

I'm currently creating a chat app based off of Rey Wenderlich's chat app tutorial which is going great except I can't seem to reconnect without having to run the app from Xcode again.

It goes something like this: run server -> run app (At this point, everything is great) then I stop server -> run server again at which point my streams refuse to reconnect and keep giving me the erorr: Error Domain=NSPOSIXErrorDomain Code=61 "Connection refused".

Any ideas why this is?

Method to init streams:

- (void)initStreams {

    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)SERVER_IP, port, &readStream, &writeStream);

    inputStream = (__bridge NSInputStream *)readStream;
    outputStream = (__bridge NSOutputStream *)writeStream;

    inputStream.delegate = self;
    outputStream.delegate = self;

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

    [inputStream open];
    [outputStream open];
}

My delegate

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {

    NSString *streamName = @"Output Stream";
    if (aStream == inputStream) {
        streamName = @"Input Stream";
    }

    switch (eventCode) {
        case NSStreamEventOpenCompleted:
            NSLog(@"%@ opened! (%lu)",streamName, eventCode);
            [_delegate socketDidOpenSuccessfully];
            break;

        case NSStreamEventHasBytesAvailable:
            [self readDataFromStream:aStream];
            break;

        case NSStreamEventErrorOccurred:
            NSLog(@"Error: %@",[aStream streamError]);
            [self resetStreams];
            break;

        case NSStreamEventEndEncountered:
            NSLog(@"%@ read ended! (%lu)",streamName, eventCode);
            [self resetStreams];
            break;

        default:
            NSLog(@"Unknown %@: %d",streamName, (int)eventCode);
            break;
    }
}

Reset streams Method:

- (void)resetStreams {
    NSLog(@"Reseting!");
    toSend = [NSMutableArray new];
    _loginStatus = LTLoginStatusLoggedOut;

    [inputStream close];
    [outputStream close];

    [self performSelector:@selector(initStreams) withObject:self afterDelay:2];
}

Upvotes: 1

Views: 569

Answers (1)

Lorenzo Ang
Lorenzo Ang

Reputation: 1318

So after hours of frustration, I decided to just wrap it in another object and re instantiate that whenever it gets disconnected. Seems to work whereas re-initiating the stream does not.

Upvotes: 1

Related Questions