我的socket测试应用程序遇到了一个有趣的问题。
我已经设置了一个带有AcceptCallback函数的侦听套接字。我使用以下方法连接到侦听套接字:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault,
(CFStringRef) self.clientService.hostName,
self.clientService.port,
&myReadStream,
&myWriteStream);
我将数据发送回监听套接字myReadStream和myWriteStream,我将这两个转换为NSStream等价物。
发送许多单独的数据包后会出现问题。数据包的大小无关紧要,它是引入错误的数据包数量(或CFStreamCreatePairWithSocketToHost创建的数量)。
在我发送大量数据包(可能大约100或200)之后,当我尝试通过NSOutputStream发送数据时,我在NSStreamEvent回调中收到错误:
Operation could not be completed. (NSUnknownErrorDomain error 8.)
然后,如果我尝试创建新服务并将其发布到网络上,当我尝试解析新地址时会出现错误。它在NSNetService:didNotResolve委托方法中给出了错误代码10(此外,错误描述在这里是空白的。)
这几乎就像监听套接字是“满”一样,但它似乎认为它运行正常,因为当我检查CFSocketIsValid时它返回true。
我很难过并花了几个小时试图调试情况......有什么想法吗?感谢。
答案 0 :(得分:2)
好吧,我想出了这个问题。
连接到套接字并初始化读写流时,如下所示:
CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) self.clientService.hostName, self.clientService.port, &myInputStream, &myWriteStream);
您需要确保设置以下变量,以便在关闭CFStream或NSStream时关闭较低级别的BSD流(在我的情况下,我将CFStream转换为NSStream类型):
CFReadStreamSetProperty(myReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(myWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
如果你没有设置这个属性,BSD流永远不会真正关闭,你会遇到某种最大数量的套接字连接 - 不确定问题到底是什么。