Как обнаружить разрыв сети? - PullRequest
1 голос
/ 30 ноября 2011

Я работаю над сетевым приложением для Mac OS X 10.7 / 10.6. И мне нужно обнаружить проблемы с сетью. Другими словами мне нужно обнаружить, когда нет подключения к интернету. Я попытался добавить метод с таймером, который подключается к серверу, и показывает сообщение, если нет результатов. Но мне нужно больше решения в реальном времени. Есть ли какие-нибудь системные уведомления об отключении сети?

1 Ответ

1 голос
/ 01 декабря 2011

, если вы используете nsstreams, тогда сделайте заголовок

:

@interface CrestronClient : UIViewController <NSStreamDelegate,UIAlertViewDelegate> {

    NSInputStream *inputStream;
    NSOutputStream *outputStream;

}
@end

.m Файл:

значения инициализации обычно в методе соединения или загрузка

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, 192.168.1.1, 46651, &readStream, &writeStream);
inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

[inputStream open];
[outputStream open];

    unsigned char connectByteArray1[] = {
        0x01, 0x00, 0x07, 0x7f, 0x00, 0x00, 0x01, 0x00, 0x03, 0x40
    };

    [outputStream write:connectByteArray1 maxLength:sizeof(connectByteArray1)];

тогда ваш метод делегата:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {

    switch (streamEvent) 
    {
        case NSStreamEventOpenCompleted:
        {
            DDLogVerbose(@"Stream opened");
            break;
        }

        case NSStreamEventHasBytesAvailable:
        {
            if(!rawData) {
                rawData = [[NSMutableData data] retain];
            }
            uint8_t buf[1024];
            unsigned int len = 0;
            len = [(NSInputStream *)theStream read:buf maxLength:1024];
            if(len) {
                [rawData initWithBytes:buf length:len];                
            } else {
                DDLogVerbose(@"no buffer!");
            }
        }   
        case NSStreamEventErrorOccurred:
        {
            if ([theStream isKindOfClass:[NSInputStream class]]) {
                NSString* address = [self getAddress];
                NSString* myIPAdress = [NSString stringWithFormat:@"IP Address: %@", address];

                //[cClient updateRequest];
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Cant Connect" message:[NSString stringWithFormat:@"Cant connect to server: %@, Make sure you are connected to the proper wireless network.  Your Ip Address is %@",CCV.ipAddress,myIPAdress] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:@"Reconnect", nil];

                [alert show];
                [alert release];            
            }
            break;   
        }

        case NSStreamEventEndEncountered:
        {
            [theStream close];
            [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
            [theStream release];
            break;
        }
        case NSStreamEventHasSpaceAvailable:
        {
            //DDLogVerbose(@"has space available");
            break;
        }

        case NSStreamEventNone:
        {
            DDLogVerbose(@"none");
            break;
        }

        default:
        {
            DDLogVerbose(@"Unknown event");
        }
    }
}

вы можете видеть, что есть случаи для подключения, а не подключения, отключения это то, что вам нужно

...