2011-06-23 76 views
2

我正在使用tcp連接來連接使用ip和端口的服務器。我可以在它上面寫和讀流。我的問題是當我關閉服務器。應停止與「EXC_BAD_ACCESS」任何人都可以幫助我?ios套接字流問題

這是連接代碼:

-(void) connectToServerUsingStream:(NSString *)urlStr 
          portNo: (uint) portNo { 

    if (![urlStr isEqualToString:@""]) 
    { 
     NSURL *website = [NSURL URLWithString:urlStr]; 
     if (!website) 
     { 
      NSLog(@"%@ is not a valid URL"); 
      return; 
     } 
     else 
     { 
      [NSStream getStreamsToHostNamed:urlStr 
             port:portNo 
           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]; 
      [oStream open]; 

      [iStream open];    
     } 
    }  
} 

,這是流事件的委託:

- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode { 
    switch(eventCode) { 
     case NSStreamEventHasBytesAvailable: 
     { 
      if (data == nil) 
      { 
       data = [[NSMutableData alloc] init]; 
      } 
      uint8_t buf[1024]; 
      unsigned int len = 0; 
      len = [(NSInputStream *)stream read:buf maxLength:1024]; 
      if(len) 
      {  
       [data appendBytes:(const void *)buf length:len]; 
       int bytesRead; 
       bytesRead += len; 

      } 
      else 
      { 

       NSLog(@"No data."); 
       return; 
      } 

      NSString *str = [[NSString alloc] initWithData:data 
                encoding:NSUTF8StringEncoding]; 
      NSLog(@"From server: %@",str); 
      [str release]; 
      [data release];   
      data = nil; 
      break; 
     } 
     case NSStreamEventErrorOccurred: 
     { 
      NSError *theError = [stream streamError]; 
      NSLog(@"Error reading stream! ,Error %i: %@",[theError code], [theError localizedDescription]); 
      [self disconnect]; 
      [self connectToServerUsingStream:kHostIP portNo:kPort]; 
      break; 
     } 
     case NSStreamEventHasSpaceAvailable: 
     { 
      if(stream == oStream && !isDataSent) 
      { 
       isDataSent = YES; 
       [self writeToServer:@"HI"]; 
      } 
      break; 
     } 
    } 
} 

回答

0

什麼日誌消息你爲什麼這樣,你可以看到你的代碼的部分被調用?

您是否嘗試過設置一些斷點,然後逐步查看失敗的確切位置,並在沒有正確保留/釋放的情況下檢查對象?

到目前爲止您還採取了哪些其他調試步驟?

+0

謝謝所有的答案問題是關閉後服務器的數據長度爲-1,這不能在'NSStreamEventHasBytesAvailable'情況下處理 – someone

1

您應該實現NSStreamEventEndEncountered大小寫並關閉/釋放流。

0

嘗試添加下面的鏈接器標誌:

OTHER_LDFLAGS = -lz -lxml2 -ltidy -ObjC 

到項目中。