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