有人可以告诉我CFStreamCreatePairWithSocketToCFHost
和CFStreamCreatePairWithSocketToHost
来电之间的区别。
另外什么是CFAllocator
,如果是NULL
或kCFAllocatorDefault
则是什么意思。由于它的kCFAllocatorDefault
是一个常量,因此有人可以解释kCFAllocatorDefault
的遗传或仅仅是出于历史目的吗?
答案 0 :(得分:3)
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
完全相同,代码只使用系统调用。