2011-10-17 3 views
2

Apple CFNetwork 프레임 워크를 통한 영구 HTTP 연결을 사용하여 서버 오버 헤드를 줄이려고합니다. 그러나 그것에 관한 문서는 거의 없습니다. 나는 프레임 워크를 재활용 것을 제안 찾을 수있는 유일한 정보는 한 적절한 플래그 설정으로 개발자를 대신하여 스트림 :CFNetwork 영구 연결 (활성 유지)

 CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, methodString, url, kCFHTTPVersion1_1); 
     CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Keep-Alive"), CFSTR("120")); <--- This line 

     //Set message body if we're posting 
     if (msDetails.eType == HttpRequestDetails::POST) 
     { 
      CFDataRef bodyRef = CFDataCreate(kCFAllocatorDefault, (const UInt8*)msDetails.strBody.c_str(), msDetails.strBody.length()); 
      CFHTTPMessageSetBody(request, bodyRef); 
      CFRelease(bodyRef); 
     } 

     //Create the read stream... 
     CFReadStreamRef ReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request); 

     //...use persistent connections.. 
     CFReadStreamSetProperty(ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue); <--- This line 

     //...enable SSL if the URL is https 
     if(msDetails.strURL[4] == 's') 
     { 
      //Hey an https request 
      CFMutableDictionaryRef pDict = CFDictionaryCreateMutable(kCFAllocatorDefault, 2, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); 
      CFDictionarySetValue(pDict, kCFStreamSSLValidatesCertificateChain, kCFBooleanFalse); 
      CFDictionarySetValue(pDict, kCFStreamPropertySocketSecurityLevel, kCFStreamSocketSecurityLevelSSLv3); 
      CFReadStreamSetProperty(ReadStream, kCFStreamPropertySSLSettings, pDict); 
      CFRelease(pDict); 
     } 

     CFReadStreamOpen(ReadStream); 

위의 코드는 "CFNetwork에서 내부 오류"가 발생합니다. CFReadStreamSetProperty (ReadStream, kCFStreamPropertyHTTPAttemptPersistentConnection, kCFBooleanTrue) 호출을 제거하면 더 이상 오류가 발생하지 않습니다. 데이터 읽기를 마친 후에는 readstream을 닫지 만 스트림 풀을 직접 관리해야 할 필요가 있다는 것도 언급 할 필요가 있습니다.

누구나 나를 참조 할 수있는 문서, 예제 또는 자습서가 있습니까? Obj-C의 사용을 최소화해야한다고 주장하는 고객이 있기 때문에 CFNetwork를 계속 사용하고 싶습니다.

+0

이 주제에 대한 자세한 정보입니다. 외관상으로는 CFNetwork는 개방 된 시내 전화에 열려있는 연결을 재사용 할 것입니다. 열려있는 연결이없는 경우 새 연결이 열립니다 (의미가 있음). 영구 연결을 원하면 열려 있어야합니다. 즉, 새 스트림을 열 때 기존 연결을 다시 사용하고 이전 스트림을 닫으려면 현재 도메인에 대한 연결이 열려 있는지 여부를 결정해야합니다. – Downie

답변

-1

CFNetwork.framework

나는 똑같은 고민했습니다

+0

나는 당신의 답을 이해할 수 있을지 확신하지 못합니다. CFHTTPStream과의 지속적인 연결을 가능하게하는 방법은 무엇입니까? – Downie

1

#import <CFNetwork/CFHTTPStream.h>를 추가합니다.

모든 스트림 설정이 요청에 대해 정확히 동일해야합니다. 특히 모든 요청에 ​​대해 동일한 사전 개체를 kCFStreamPropertySSLSettings에 전달해야합니다. 그들이 같은 내용을 가지고 있다고해서 충분하지 않습니다. 똑같은 사전을 다시 사용해야합니다.