NSInputStream getBuffer:length:不起作用?

时间:2010-10-29 10:34:09

标签: objective-c nsinputstream

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

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

` case 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;
    }

`

如果有人可以帮助我会很好!

3 个答案:

答案 0 :(得分:10)

达尔文是开源的,所以“真相就在那里”。 NSStream的源代码显示GSInetInputStream是为套接字实现NSInputStream的类,并且该类的getBuffer:length:的实现简洁地回答了这个问题:

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

找到here

答案 1 :(得分:0)

我认为getBuffer没有工作,因为还没有缓冲区,之后你正在读入缓冲区,所以它无法获得指向缓冲区的指针......

答案 2 :(得分:0)

啊,我想我明白你的意思。但我想以下代码至少应该在读入缓冲区后评估为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.");
        }

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