Тайм-аут сокета - нужна помощь - PullRequest
3 голосов
/ 28 марта 2011

Я использую эту реализацию для подключения к сокету сервера, когда я пытался подключиться к несуществующему серверу сокетов, он входит в бесконечный цикл, как я могу установить тайм-аут?

+ (void)getStreamsToHostNamed:(NSString *)hostName 
                         port:(NSInteger)port 
                  inputStream:(NSInputStream **)inputStreamPtr 
                 outputStream:(NSOutputStream **)outputStreamPtr 

{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;

    assert(hostName != nil);
    assert((port > 0) && (port < 65536));
    assert((inputStreamPtr != NULL) || (outputStreamPtr != NULL));

    readStream = NULL;
    writeStream = NULL;

    CFStreamCreatePairWithSocketToHost(
                                       NULL, 
                                       (CFStringRef) hostName, 
                                       port, 
                                       ((inputStreamPtr  != nil) ? &readStream : NULL),
                                       ((outputStreamPtr != nil) ? &writeStream : NULL)
                                       );

    if (inputStreamPtr != NULL) {
        *inputStreamPtr  = [NSMakeCollectable(readStream) autorelease];
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = [NSMakeCollectable(writeStream) autorelease];
    }
}

@end

@implementation sockets

@synthesize iStream;
@synthesize oStream;
@synthesize model;

- (void) connect: (NSString*) IPAdress and:(NSInteger) porto{

    NSString *temporary =  [NSString stringWithFormat: @"%@", IPAdress];
    [NSStream getStreamsToHostNamed:temporary port:porto
                        inputStream:&iStream 
                       outputStream:&oStream];

    [iStream retain];
    [oStream retain];
    [iStream setDelegate:self];
    [oStream setDelegate:self];
    [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
    [iStream open];
    [oStream open];
    NSLog (@"Conectado");


}

Заранее спасибо!

1 Ответ

4 голосов
/ 25 апреля 2011

Если вы хотите тайм-аут, запланируйте таймер. Если таймер срабатывает до прибытия NSStreamEventOpenCompleted, значит, у вас истекло время ожидания. Отвечайте соответствующим образом (отключите потоки и т. Д.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...