NSInputStream read возвращает беззнаковое целое максимальное значение, когда байты доступны - PullRequest
3 голосов
/ 02 января 2012

Я пытаюсь читать и записывать данные из / в Socket с NSStream.Вот мой код для подключения:

- (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)

Почему метод чтения возвращает это большое значение?Это действительно читает так много байтов?(Я так не думаю) :)

PS: Сервер Socket Stream в порядке.он также читает и записывает данные другим клиентам, и проблем нет.

Ответы [ 3 ]

3 голосов
/ 17 февраля 2013

из NSInputStream читает: документация maxLength:

Возвращаемое значение Число, указывающее результат операции. Положительное число указывает число прочитанных байтов. 0 указывает, что достигнут конец буфера.отрицательное число означает, что операция завершилась неудачно

, поэтому в случае окончания потока ваш len равен 0, в случае ошибки он равен -1, что объясняет значение 4294967295 для вашего целого без знака.1008 *, поэтому используйте int со знаком и проверяйте наличие отрицательных значений.

3 голосов
/ 02 января 2012

Я решил проблему.Я писал данные без наблюдения, если в выходном потоке есть место.

0 голосов
/ 20 ноября 2015

Если из CFReadStreamRead() метод возвращает 1, означает, что запрос не выполнен, следует выполнить обработку ошибки. CFReadStreamRead() метод чтения сбоя вернет 1, с 4294967295-1 это тот же блок памяти, поэтому длина была 4294967295.

...