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

时间:2010-02-14 18:16:44

标签: iphone sockets

我的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。

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

1 个答案:

答案 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流永远不会真正关闭,你会遇到某种最大数量的套接字连接 - 不确定问题到底是什么。