【问题标题】:What does the hasSpaceAvailable property on NSOutputStream mean?NSOutputStream 上的 hasSpaceAvailable 属性是什么意思?
【发布时间】:2016-11-16 14:59:54
【问题描述】:

我正试图围绕 NSOutputStream 上 hasSpaceAvailable 背后的逻辑。

在我的应用程序中,我通过由 NSInput/output 流管理的 CFSocket 发送大量数据 (100MB),分成 4080 字节的块(硬限制)。

当我开始写入数据时,大约四分之一处 hasSpaceAvailable 突然变为 NO,因此我将数据添加到队列中。但是,如果我忽略这一点并尝试写入数据,则写入似乎可以工作,因为write:maxLength: 的返回值与 maxLength 参数 (4080) 匹配。

输出流有什么空间?据我所知,在使用 UNIX/Berkley 套接字时,没有可用于确定套接字是否可以写入的逻辑,您只需编写并确定是否已写入所有数据。

该属性的文档说明:

一个布尔值,指示是否可以写入接收器。 (只读)
YES 如果可以写入接收器,或者如果必须尝试写入以确定是否有可用空间,则NO 否则。

在我看到 NO 的示例中,当我仍然可以写入该套接字时,是什么因素导致了这个结果。

【问题讨论】:

    标签: objective-c sockets nsstream nsoutputstream cfsocket


    【解决方案1】:

    认为如果自上次调用 write 方法后流已发送“可用空间”流事件,hasSpaceAvailable 属性只会返回 YES。您不应该轮询该属性,并且可以说它甚至不应该存在。相反,您应该等待输出流上的流事件表明有空间可用于写入。

    当该流事件发生时,这意味着传出数据包队列的字节数至少比套接字配置为允许您排队的最大字节数少一个字节。也就是说,socket 上的 send() 或 write() 系统调用保证至少写入一个字节而不阻塞,并且保证 socket 处于非阻塞模式。

    请注意,写入数据后,如果流的缓冲区可以接收更多数据(或者如果缓冲区已满,则在发送了一些数据之后),流将立即发送另一个可用空间事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2016-04-06
      • 2016-06-07
      • 1970-01-01
      相关资源
      最近更新 更多