2011-03-28 132 views
3

我正在使用此实现来连接到服务器套接字,当我试图连接到一个不存在的套接字服务器它进入一个无限循环时,我如何设置超时?套接字超时 - 需要帮助

+ (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"); 


} 

在此先感谢!

回答

4

如果您想要超时,请安排计时器。如果计时器在NSStreamEventOpenCompleted到达之前触发,则表示超时。视情况作出回应(关闭流等)。