Технические вопросы и ответы 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). |