Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSOutputStream上的hasSpaceAvailable属性是什么意思?_Objective C_Sockets_Nsstream_Nsoutputstream_Cfsocket - Fatal编程技术网

Objective c NSOutputStream上的hasSpaceAvailable属性是什么意思?

Objective c NSOutputStream上的hasSpaceAvailable属性是什么意思?,objective-c,sockets,nsstream,nsoutputstream,cfsocket,Objective C,Sockets,Nsstream,Nsoutputstream,Cfsocket,我正试图了解NSOutputStream上hasSpaceAvailable背后的逻辑 在我的应用程序中,我通过NSInput/output streams管理的CFSocket发送大量数据(100MB),这些数据被分成4080字节的块(硬限制) 当我开始写数据时,大约四分之一的hasspaceavable突然变成了NO,因此我将数据添加到队列中。但是,如果我忽略了这一点,并尝试以任何方式写入数据,那么写入操作似乎会作为write:maxLength:的返回值与maxLength参数(4080)

我正试图了解NSOutputStream上
hasSpaceAvailable
背后的逻辑

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

当我开始写数据时,大约四分之一的hasspaceavable突然变成了
NO
,因此我将数据添加到队列中。但是,如果我忽略了这一点,并尝试以任何方式写入数据,那么写入操作似乎会作为
write:maxLength:
的返回值与maxLength参数(4080)匹配

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

财产的文件说明:

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

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

我认为,如果自上次调用write方法以来,流发送了“可用空间”流事件,HassPaceAvable属性只会返回“是”。你不应该调查那个属性,它甚至不应该存在。相反,您应该等待输出流上的流事件,该事件表示有空间可供写入

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

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