Технические вопросы и ответы QA1652

Используя NSStreams для соединения TCP без NSHost

Q: Учитывая, что +getStreamsToHost:port:inputStream:outputStream: не поддерживается на iOS, как я могу создать NSStreams для соединения TCP к именованному узлу?

A: Можно сделать это путем использования бесплатного моста между NSStream и CFStream. Использовать CFStreamCreatePairWithSocketToHost создать CFStreams к узлу, и затем бросить получающийся CFStreams к NSStreams.

Перечисление 1 показывает пример этого. Это добавляет категорию к NSStream, реализующему замену для +getStreamsToHost:port:inputStream:outputStream:.

Перечисление 1  категория для создания потоков TCP к именованному узлу

@interface NSStream (QNetworkAdditions)
 
+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
    port:(NSInteger)port
    inputStream:(out NSInputStream **)inputStreamPtr
    outputStream:(out NSOutputStream **)outputStreamPtr;
 
@end
 
@implementation NSStream (QNetworkAdditions)
 
+ (void)qNetworkAdditions_getStreamsToHostNamed:(NSString *)hostName
    port:(NSInteger)port
    inputStream:(out NSInputStream **)inputStreamPtr
    outputStream:(out NSOutputStream **)outputStreamPtr
{
    CFReadStreamRef     readStream;
    CFWriteStreamRef    writeStream;
 
    assert(hostName != nil);
    assert( (port > 0) && (port < 65536) );
    assert( (inputStreamPtr != NULL) || (outputStreamPtr != NULL) );
 
    readStream = NULL;
    writeStream = NULL;
 
    CFStreamCreatePairWithSocketToHost(
        NULL,
        (__bridge CFStringRef) hostName,
        port,
        ((inputStreamPtr  != NULL) ? &readStream : NULL),
        ((outputStreamPtr != NULL) ? &writeStream : NULL)
    );
 
    if (inputStreamPtr != NULL) {
        *inputStreamPtr  = CFBridgingRelease(readStream);
    }
    if (outputStreamPtr != NULL) {
        *outputStreamPtr = CFBridgingRelease(writeStream);
    }
}
 
@end


История версии документа


ДатаПримечания
27.03.2012

Фиксированный опечатка (r. 11064426).

19.10.2011

Обновленный код для поддержки автоматического подсчета ссылок (ARC).

23.06.2009

Новый документ, описывающий, как создать TCP NSStreams без NSHost (который не поддерживается на iOS).