Сбой iPhone Socket после большого количества передач данных - PullRequest
5 голосов
/ 14 февраля 2010

У меня интересная проблема с моим приложением для тестирования сокетов.

Я настроил сокет прослушивания с функцией 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.)

Затем, если я пытаюсь создать новый сервис и опубликовать его в сети, я получаю сообщение об ошибке, когда пытаюсь разрешить новый адрес. Это дает мне код ошибки 10 в NSNetService: метод делегата didNotResolve (также, описание ошибки здесь пусто).

Это почти как если бы прослушивающий сокет был "полон", но кажется, что он работает нормально, потому что когда я проверяю CFSocketIsValid, он возвращает true.

Я в тупике и потратил несколько часов, пытаясь отладить ситуацию ... Есть какие-нибудь мысли? Спасибо.

1 Ответ

2 голосов
/ 16 февраля 2010

Хорошо, я понял проблему.

При подключении к сокету и инициализации потока чтения и записи, как показано ниже:

CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (CFStringRef) self.clientService.hostName, self.clientService.port, &myInputStream, &myWriteStream);

вам нужно убедиться, что вы установили следующую переменную так, чтобы поток BSD нижнего уровня закрывался при закрытии CFStream или NSStream (в моем случае я приводил CFStream к типу NSStream):

CFReadStreamSetProperty(myReadStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);
CFWriteStreamSetProperty(myWriteStream, kCFStreamPropertyShouldCloseNativeSocket, kCFBooleanTrue);

Если вы не установите это свойство, поток BSD никогда не закроется, и вы достигнете какого-то максимального числа соединений сокетов - точно не знаете, в чем проблема.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...