Постоянное соединение CFNetwork (Keep alives) - PullRequest
2 голосов
/ 17 октября 2011

Я пытаюсь снизить нагрузку на сервер, используя постоянные HTTP-соединения через инфраструктуру Apple 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), то я больше не получаю сообщение об ошибке.Стоит также упомянуть, что после завершения чтения данных я закрываю поток чтения, но, возможно, мне нужно самостоятельно управлять пулом потоков?

У кого-нибудь есть какая-либо документация, примеры или руководства, на которые они могут ссылаться?Я стремлюсь продолжать использовать материал CFNetwork, поскольку у нас есть клиент, который настаивает на том, что мы должны минимизировать использование Obj-C.

Ответы [ 2 ]

1 голос
/ 18 июня 2012

Я боролся с одной и той же вещью.

Кажется, ключ в том, чтобы убедиться, что все настройки потока одинаковы для запросов.В частности, вы должны передать EXACT один и тот же объект словаря в kCFStreamPropertySSLSettings для всех запросов.Недостаточно того, что они имеют одинаковое содержимое, вы должны повторно использовать один и тот же словарь.

0 голосов
/ 02 февраля 2012

добавить CFNetwork.framework

и #import <CFNetwork/CFHTTPStream.h>

...