2011-06-23 21 views
2

私はtcp接続を使用して、ipとportを使ってサーバに接続しています。私はそれにストリームを書き込んで読むことができます。私の問題は、私が誰かが私を助けることができる "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 caseを実装し、ストリームを閉じたり解放したりしてください。プロジェクトに

OTHER_LDFLAGS = -lz -lxml2 -ltidy -ObjC 

:次のリンカのフラグを追加する

0

してみてください。