我有一个使用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?
答案 0 :(得分:5)
我发现了这个问题,我的连接打开后就发送了一个缓冲区。如果此缓冲区中没有数据,则发送空缓冲区,这是流的结束信号。
如果连接的另一端关闭连接:
您的连接委托的流:handleEvent:方法被调用 streamEvent设置为NSStreamEventHasBytesAvailable。当你读 那个流,你得到一个零(0)的长度。
您的连接委托的流:handleEvent:方法在streamEvent设置为的情况下调用 NSStreamEventEndEncountered。
当这两个事件中的任何一个发生时, 委托方法负责检测文件结束 条件和清理。