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