NSStream在打开期间接收NSStreamEventEndEncountered

imp*_*t27 3 sockets nsstream cfstream

我有一个使用NSStream连接的客户端 - 服务器应用程序.有时在尝试打开连接时,连接的一端在首次尝试发送消息时会获得NSStreamEventEndEncountered.

我使用CFStream和NSStream之间的桥梁.我的服务器创建一个套接字:

_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);
Run Code Online (Sandbox Code Playgroud)

在handleConnect回调函数中,CFStreamCreatePairWithSocket用于获取两个CFStream.

我的客户端CFStreamCreatePairWithSocketToHost用来连接主机.

客户端连接(创建NSStream)然后发送ping.当我的服务器收到连接时,它会打开一个NSStream,当它收到ping时它发送一个pong.

当其中一个连接关闭时,另一个应该获得NSStreanEventEndEncountered,因为我已kCFStreamPropertyShouldCloseNativeSocket在流上设置为true.

我得到了几个不同的结果:我使用NSLog来查看发生了什么.

- 大多数时候连接打开并按预期工作.

Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong
Run Code Online (Sandbox Code Playgroud)

- 尝试发送pong时,连接关闭(NSStreamEventEndEncountered).客户端不接收pong但收到NSStreamEventEndEncountered

Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed
Run Code Online (Sandbox Code Playgroud)

- 尝试发送ping时连接关闭(NSStreamEventEndEncountered).服务器不接收ping或NSStreamEventEndEncountered

Server did recieve new connection
Client closed
Run Code Online (Sandbox Code Playgroud)

- 尝试发送ping时收到错误:

Server did recieve new connection;
Error recieved: The operation couldn’t be completed. Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

客户端和服务器都在我的计算机上.为什么流在尝试写入时会获得NSStreamEventEndEncountered?

imp*_*t27 6

我发现了这个问题,我的连接打开后就发送了一个缓冲区.如果此缓冲区中没有数据,则发送空缓冲区,这是流的结束信号.

来自Apple Doc:

如果连接的另一端关闭连接:

您的连接委托的流:handleEvent:方法被调用,streamEvent设置为NSStreamEventHasBytesAvailable.从该流读取时,长度为零(0).

您的连接委托的流:handleEvent:方法被调用,streamEvent设置为NSStreamEventEndEncountered.

当发生这两个事件中的任何一个时,委托方法负责检测文件结束条件和清理.