大量数据传输后,iPhone Socket失败

dev*_*nkb 5 sockets iphone

我的套接字测试应用程序有一个有趣的问题.

我已经设置了一个带有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.

我很难过,花了几个小时试图调试情况......有什么想法吗?谢谢.

dev*_*nkb 2

好吧,我明白了这个问题。

当连接到套接字并初始化读写流时,如下所示:

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 流实际上永远不会关闭,并且您会达到某种最大套接字连接数 - 不确定到底是什么问题。