当可用字节时,NSInputStream读取返回无符号整数最大值

时间:2012-01-02 12:25:22

标签: objective-c ios nsdata nsstream

我尝试使用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服务器还可以。它也可以读取和写入其他客户端的数据,没有问题。

3 个答案:

答案 0 :(得分:3)

我解决了这个问题。我在没有观察输出流中是否有可用空间的情况下编写数据。

答案 1 :(得分:3)

来自NSInputStream的

:maxLength文档:

  

返回值   表示操作结果的数字   正数表示读取的字节数   0表示已达到缓冲区的末尾   负数表示操作失败

所以在流结束的情况下你的len是0,如果是错误,它是-1,这解释了unsigned int上的4294967295值。

所以使用signed int并检查负值。

答案 2 :(得分:0)

如果从CFReadStreamRead()方法返回1,表示请求失败,则应该执行失败处理。 读取失败的CFReadStreamRead()方法将返回1,与4294967295-1是同一块内存,因此长度为4294967295。