NSStream在打开期间接收NSStreamEventEndEncountered

时间:2014-06-08 16:02:02

标签: sockets nsstream cfstream

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

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

_ipv4cfsock = CFSocketCreate(kCFAllocatorDefault,PF_INET, SOCK_STREAM,IPPROTO_TCP, kCFSocketAcceptCallBack, handleConnect, &info);

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

我的客户端使用CFStreamCreatePairWithSocketToHost连接到主机。

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

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

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

- 大多数时间连接打开并按预期工作。

Server did recieve new connection
Server recieved ping
Server Sent pong
Client recieved pong

- 尝试发送pong时连接关闭(NSStreamEventEndEncountered)。客户没有收到乒乓球但收到NSStreamEventEndEncountered

Server did recieve new connection
Server recieved ping
Server recieved pong
Server closed
Client closed

- 尝试发送ping时连接关闭(NSStreamEventEndEncountered)。服务器没有收到ping或NSStreamEventEndEncountered

Server did recieve new connection
Client closed

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

Server did recieve new connection;
Error recieved: The operation couldn’t be completed. Connection reset by peer

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

1 个答案:

答案 0 :(得分:5)

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

来自Apple Doc:

  

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

     

您的连接委托的流:handleEvent:方法被调用   streamEvent设置为NSStreamEventHasBytesAvailable。当你读   那个流,你得到一个零(0)的长度。

     

您的连接委托的流:handleEvent:方法在streamEvent设置为的情况下调用   NSStreamEventEndEncountered。

     

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