Разница между CFStreamCreatePairWithSocketToCFHost
и CFStreamCreatePairWithSocketToHost
заключается просто в способе передачи адреса.
В CFStreamCreatePairWithSocketToHost
вы можете просто определить CFStringRef
(или NSString
) для представления домена / ip хоста.
Однако, с версией CFHost
она дает вам контроль над адресом через структуру sockaddr_in
, определенную в <netinet/in.h>
. Вы создаете CFHostRef
способом, подобным следующему:
struct sockaddr_in ip4addr; // note that this only works for ipv4, for ipv6 you need struct sockaddr_in6.
ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr);
CFDataRef sockData = CFDataCreate(NULL, &ip4addr, sizeof(ip4addr));
CFHostRef host = CFHostCreateWithAddress(NULL, sockData);
// use 'host' to create your stream
CFRelease(host);
CFRelease(sockData);
Это дает вам некоторый (в основном ненужный) контроль над тем, что вы делаете с самим сокетом, в большинстве случаев версия CFHost
не требуется.
Для CFAllocator
, опять же, документация - ваш друг. Он используется как способ CoreFoundation
для отладки вызовов malloc
, free
и realloc
во всем коде.
Это объект, который позволяет вам писать свои собственные методы для выделения памяти для объекта, а kCFAllocatorDefault
использует стандартные вызовы malloc
, free
и realloc
, используемые системой. Передача NULL
для CFAllocator
работает точно так же, как kCFAllocatorDefault
, код использует только системные вызовы.