Prevent останавливает приложение с NSStream в режиме опроса

Я реализовал перенос клиент-сервер из настольного приложения Windows в приложение для iPhone. Передаю данные с помощью NSStream в режиме опроса (синхронно).

CFReadStreamRef readStream;
CFWriteStreamRef writeStream;

CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)urlStr, portNo, &readStream, &writeStream);

inputStream = (NSInputStream *)readStream;
outputStream = (NSOutputStream *)writeStream;

[inputStream open];
[outputStream open];

Все работает нормально, но когда я пытаюсь подключить несуществующий сервер или отключенный сервер, или номер порта / IP-адрес неверен, метод WRITE объекта NSOutputStream останавливает выполнение приложения.

const uint8_t *str = (uint8_t *) [strRichiesta cStringUsingEncoding:NSASCIIStringEncoding];
[outputStream write:str maxLength:strlen((char*)str)]; 

Можно ли управлять методом, вставив элемент управления таймаутом? Если да, то как мне это сделать?

Я думаю, что такая же проблема возникает и с методом READ объекта NSInputStream.

Кто-нибудь может мне помочь, пожалуйста?


person Gigi    schedule 18.01.2012    source источник


Ответы (1)


Проверьте функции NSStreams 'streamStatus и streamError, прежде чем пытаться использовать их для чтения и записи. См. Статью Apple Документация NSStream для получения дополнительной информации.

Это также может помочь: Настройка потоков для сокетов

РЕДАКТИРОВАТЬ: значения NSStreamStatus:

typedef enum {
    NSStreamStatusNotOpen = 0,
    NSStreamStatusOpening = 1,
    NSStreamStatusOpen = 2,
    NSStreamStatusReading = 3,
    NSStreamStatusWriting = 4,
    NSStreamStatusAtEnd = 5,
    NSStreamStatusClosed = 6,
    NSStreamStatusError = 7
};

Вам придется подождать, пока статус не станет Открытым, прежде чем использовать его. Может пройти несколько секунд (возможно, даже 30 секунд), чтобы неверный URL-адрес преобразовался в статус «Ошибка».

person MechEthan    schedule 19.01.2012
comment
Спасибо, но я уже пробовал ... без разницы. Во всех случаях streamStatus = 1 и streamError = пустая строка. - person Gigi; 19.01.2012
comment
Да, streamStatus 1 означает, что он не готов к использованию. См. Мое редактирование для получения дополнительной информации. - person MechEthan; 19.01.2012