2015-02-27 4 views
1

Я использую следующий код, чтобы получить собственный дескриптор сокета в приложении iOS.Звонок для получения родного сокета для CFStream всегда терпит неудачу на iOS

CFReadStreamRef readStream = NULL; 
CFWriteStreamRef writeStream = NULL; 

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)@"example.com", 443, &readStream, &writeStream); 

Boolean readOpen = CFReadStreamOpen(readStream); 
Boolean writeOpen = CFWriteStreamOpen(writeStream); 

CFDataRef socketData = CFWriteStreamCopyProperty(writeStream, kCFStreamPropertySocketNativeHandle); 
if (socketData == NULL) { 
    NSLog(@"Failed to get native socket!"); // Always fails 
} 

Однако результат функции CFWriteStreamCopyProperty всегда NULL. Оба вызова для открытия сокета успешны (readOpen и writeOpen являются истинными). Я не мог найти документацию о том, почему это может потерпеть неудачу. В чем причина того, что этот код работает не так, как ожидалось?

+0

API-интерфейс вы назвали неправильно: http://stackoverflow.com/questions/4082686/is-there-a-way-to-get-the-socket-reference-by-using-cfstreamcreatepairwithsocket – bluealert

+0

@bluealert нет. См. Принятый ответ – jonnydee

ответ

1

Поток может быть открыт в фоновом режиме, и в этом случае CFWriteStreamOpen всегда будет возвращать значение true, а статус потока будет kCFStreamStatusOpening. Только после того, как поток был успешно открыт, вы можете получить собственный сокет. Вы можете использовать CFWriteStreamScheduleWithRunLoop для прослушивания открытого события.