NSInputStream getBuffer:长度:不起作用?

问题描述:

我真的很想使用NSInputStream的getBuffer:length:方法。 经过大量研究,我找不到使用此方法的有效示例,因为大多数人确实需要read: maxLength:NSInputStream getBuffer:长度:不起作用?

所以现在对周围的一些事实: *我为iPhone开发应用程序,iOS版3.1.3 *我已经建立了通过套接字 *该网络连接实际工作网络通信;所以我没有忘记添加一个流到runloop或一个有效的委托或这样的事情 - 它已经工作 *我只在网络上发送和接收字符串。 *我设置了一个有效的代表,正确实施stream: handleEvent:(区分收到的事件并采取适当的措施)。 我不确定接收代码是否100%正确,因为我有时会收到两次消息。 这也可能是由于我与之通信的设备上存在错误的实现。 为了弄清楚哪一点是最后一点,我试图找出有多少字节真的在接收缓冲区,当我收到“NSStreamEventHasBytesAvailable”事件。 由于我不确定我的实现是否正确,但我想知道实际收到的字节数,所以我想使用getBuffer: length:并查看后面的长度。 奇怪的是:长度永远不会打印在控制台上,因为 [((NSInputStream *) stream) getBuffer: &buf length: &numBytes]总是计算为FALSE。 无论如何,这部分代码事后工作正常,在缓冲区中接收消息并正确转发 - 效果很好。 问题依然存在:为什么getBuffer: length:没有工作? 感兴趣的代码是在这里:

` 情况下NSStreamEventHasBytesAvailable:{

 uint8_t *buf; 
     unsigned int numBytes; 

     if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) { 
      NSLog(@"\t\tBytes in the buffer: %i", &numBytes); 
     } 

     uint8_t buffer[BUFFER_SIZE]; 
     int len = [((NSInputStream *) stream) read: buffer 
             maxLength: BUFFER_SIZE]; 
     NSLog(@"\tread: %i bytes", len); 

     /* 
     if len > 0: len is equal to the filled byte elements 
     if len == 0: end of buffer was reached while reading 
     if len < 0: something terrible happened... 
     */ 
     if (len > 0) { 
      /* 1. create string from received byte buffer */ 
      NSString *msg = [[NSString alloc] initWithBytes: buffer length: len encoding: NSASCIIStringEncoding]; 
      NSLog(@"\tcontained message: %@", msg); 
      /* 2. inform communicator about received message */ 
      [communicator received: msg]; 
      [msg release]; 
     } 

     if (len < 0) { 
      [communicator received: @"Error!"]; 
     } 
     break; 
    } 

`

将是很好,如果有人可以帮助我!

达尔文是开源的,所以“真相在那里”。对于NSStream源显示GSInetInputStream是实现NSInputStream用于插座类,和的GetBuffer执行:长度:该类简洁地回答问题:

- (BOOL) getBuffer: (uint8_t **)buffer length: (unsigned int *)len 
{ 
    return NO; 
} 

实测值here

+0

嗨,你可以检查我的[关于在Swift中getBuffer的问题](http://*.com/questions/40045665/size-of-the-nsinputstream-buffer)?我有一个很奇怪的问题,高级用户提出的答案不起作用。问候! – 2016-10-16 01:29:27

我认为的GetBuffer不工作,因为没有一个缓冲的是,你正在读入缓冲区之后,所以它不能得到的指针缓冲又...

+0

没有意义,因为只有当我收到“NSStreamEventHasBytesAvailable”事件时才会执行代码,所以底层缓冲区中有数据可用(我想通过调用'getBuffer:length:'来获得引用。 。我刚刚移动了'如果getBuffer:length:'块在'read:maxLength:'块下面,并且如预期的那样:没有任何变化 – 2010-11-02 07:34:18

+0

此外:我试图读取该缓冲区而不是写入它(我认为那是什么你的意思是“读入缓冲区”?)。 – 2010-11-02 12:16:09

+0

字节可用的事件并不意味着它们仍在缓冲区中,因此有一些字节准备好从流中读入缓冲区。假设你正在打开一个文件流,当你打开这个流时,流中有可用的字节被读取,但是没有任何文件被读入缓冲区。通过“读入缓冲区”,我的意思是通过流获取字节并将它们放入缓冲区。 – Oliver 2010-11-03 06:24:33

啊,我想我明白你的意思。但是我想下面的代码应该至少在读入缓冲区之后评估为TRUE? 我只是问,因为它没有,getBuffer:length:仍然似乎没有工作。 使用可用的字节通信效果很好,但仍然是问题...

 uint8_t *buf1; 
     unsigned int numBytes1; 
     if ([((NSInputStream *) stream) getBuffer: &buf length: &numBytes]) { 
      NSLog(@"\t\tBytes are in the buffer before Op."); 
     } 

     uint8_t buffer[BUFFER_SIZE]; 
     int len = [((NSInputStream *) stream) read: buffer 
             maxLength: BUFFER_SIZE]; 

     uint8_t *buf2; 
     unsigned int numBytes2; 
     if ([((NSInputStream *) stream) getBuffer: &buf2 length: &numBytes2]) { 
      NSLog(@"\t\tBytes in the buffer after Op."); 
     } 

对不起创建答案我自己的问题;但评论能够处理这么多的代码...

+0

如果将numbytes更改为NSUInteger而不是“unsigned int”,会发生什么情况? – Oliver 2010-11-17 11:49:55

+0

缓冲区不可用,无论是在读取之前还是之后:maxLength: 。对我来说无所谓atm,因为我在没有getBuffer的情况下调试了我的应用程序的那一部分:长度: 。感谢你的时间,奥利弗! – 2010-11-23 06:43:33