objective-c - NSInputStream 获取缓冲区 : length: doesn't work?

标签 objective-c nsinputstream

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

那么现在关于周围环境的一些事实: * 我正在为 iPhone、iOS 3.1.3 开发一个应用程序 * 我已经通过套接字建立了网络通信 * 该网络连接确实有效;所以我没有忘记将一个流添加到运行循环或一个有效的委托(delegate)或类似的东西——它已经可以工作了 * 我只是通过网络发送和接收字符串。 * 我已经设置了一个有效的委托(delegate),它正确地实现了 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;
    }

`

如果有人能帮助我,那就太好了!

最佳答案

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

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

找到 here .

关于objective-c - NSInputStream 获取缓冲区 : length: doesn't work?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4051018/

相关文章:

objective-c - 使用 like 选择查询以避免使用 fmdb 时的 SQL 注入(inject)

ios - 使用谓词查找字符串值是否存在

iOS 如何执行多个 NSInputStream

ios - 将大视频文件路径转换为 ​​NSData 时出现内存问题。如何使用InputStream/FileHandle解决这个问题?

ios - 写入 NSStream 依赖 hasSpaceAvailable 方法或委托(delegate)事件 NSStreamEventHasSpaceAvailable

objective-c - 更改 UITextField 中光标的颜色

objective-c - 为什么我不能在前一个 View Controller 上查看结构值

objective-c - 通过私有(private) API 监听 iMessage 或 SMS

objective-c - 使用 NSXMLParser initWithStream : no parser delegate methods received