簡體   English   中英

當可用字節時,NSInputStream讀取返回無符號整數最大值

[英]NSInputStream read returns unsigned integer maximum value when bytes available

我嘗試使用NSStream從/向Socket讀取和寫入數據。 這是我的連接代碼:

- (void)connect
{
  [NSStream getStreamsToHostNamed:APIC_HOST_ADDR 
                             port:APIC_HOST_PORT
                      inputStream:&inStream
                     outputStream:&outStream];
  [inStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];
  [outStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

  inStream.delegate = self;
  outStream.delegate = self;

  if ([inStream streamStatus] == NSStreamStatusNotOpen)
    [inStream open];

  if ([outStream streamStatus] == NSStreamStatusNotOpen)
    [outStream open];

}

對於輸入流,我實現了委托方法來接收事件

- (void)handleInputStreamEvent:(NSStreamEvent)eventCode
{
  switch (eventCode) {
    case NSStreamEventHasBytesAvailable:
    {
    int bytesRead;
    if (data == nil) {
      data = [[NSMutableData alloc] init];
    }
    uint8_t buf[1024];
    unsigned int len = 0;
    len = [inStream read:buf maxLength:1024];
    if(len>0) {
      @try {
        [data appendBytes:(const void *)buf length:len];
      }
      @catch (NSException *exception) {
        NSLog(@"Fail: %@", exception);
      }
      @finally {
        NSLog(@"Finally");
        bytesRead += len;
      }
    } else {
      NSLog(@"No Buffer");
    }  

    NSString *str = [[NSString alloc] initWithData:data 
                                          encoding:NSUTF8StringEncoding];
    NSLog(@"%@",str);
    [str release];
    [data release];        
    data = nil;
    } break;
    case NSStreamEventErrorOccurred:
    {
      NSError *theError = [inStream streamError];
      NSLog(@"Error reading stream! ,Error %i: %@",[theError code], [theError localizedDescription]);
      [self disconnect];
      [self connect];
    } break;
  }
}

[NSStream read:maxLength:]始終返回最大無符號整數值。 最終我收到此錯誤:

Fail: *** -[NSConcreteMutableData appendBytes:length:]: unable to allocate memory for length (4294967295)

為什么閱讀mehod會帶來這么大的價值? 它真的讀了那么多字節嗎? (我不這么認為):)

PS:Socket Stream服務器還可以。 它也可以讀取和寫入其他客戶端的數據,沒有問題。

從NSInputStream中讀取:maxLength文檔:

返回值表示操作結果的數字正數表示讀取的字節數0表示已達到緩沖區的末尾負數表示操作失敗

因此,在流結束的情況下,len為0,如果出現錯誤,則為-1,這解釋了unsigned int上的4294967295值。

所以使用signed int並檢查負值。

我解決了這個問題。 我在沒有觀察輸出流中是否有可用空間的情況下編寫數據。

如果從CFReadStreamRead()方法返回1,表示請求失敗,則應該進行失敗處理。 讀取失敗的CFReadStreamRead()方法將返回1,與4294967295-1是同一塊內存,因此長度為4294967295。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM