六、进行FTP协议的数据交换
CFNetWork框架也支持与FTP协议的服务端进行数据交互,方法解析如下:
//根据URL创建FTP读取流对象 用来进行文件下载
CFReadStreamRef CFReadStreamCreateWithFTPURL(CFAllocatorRef __nullable alloc, CFURLRef ftpURL);
//解析文件或目录的格式化数据
CFIndex CFFTPCreateParsedResourceListing(CFAllocatorRef __nullable alloc, const UInt8 *buffer, CFIndex bufferLength, CFDictionaryRef __nullable * __nullable parsed);
//根据URL创建一个FTP写入流对象 用来进行文件上传
CFWriteStreamRef CFWriteStreamCreateWithFTPURL(CFAllocatorRef __nullable alloc, CFURLRef ftpURL);
对于FTP写入和读取流来说,可以使用CFReadStreamSetProperty()函数或者CFWriteStreamSetProperty()函数来进行属性的设置,可设置的属性列举如下:
kCFStreamPropertyFTPUserName //设置用户名
kCFStreamPropertyFTPPassword //设置密码
kCFStreamPropertyFTPUsePassiveMode //布尔值 设置是否被动模式
kCFStreamPropertyFTPResourceSize //资源大小
kCFStreamPropertyFTPFileTransferOffset //记录文件位置 用来断点续传
kCFStreamPropertyFTPAttemptPersistentConnection //是否重用连接
kCFStreamPropertyFTPProxy //设置代理字典
kCFStreamPropertyFTPFetchResourceInfo //资源详情字典
//下面为代理字典中可以定义的键
kCFStreamPropertyFTPProxyHost //代理主机
kCFStreamPropertyFTPProxyPort //代理端口
kCFStreamPropertyFTPProxyUser //代理用户名
kCFStreamPropertyFTPProxyPassword //代理密码
//下面是资源详情字典中可以定义的键
kCFFTPResourceMode //资源模式
kCFFTPResourceName //资源名
kCFFTPResourceOwne //资源所有者
kCFFTPResourceGroup //资源组
kCFFTPResourceLink //资源链接
kCFFTPResourceSize //资源尺寸
kCFFTPResourceType //资源类型
kCFFTPResourceModDate //修改时间
七、主机地址相关操作
CFNetWork中也封装了与主机地址域名相关的操作方法,例如,我们可以通过域名进行DNS解析出IP地址,示例代码如下:
#import <netinet/in.h>
#import <arpa/inet.h>
CFStringRef hostString = CFSTR("www.baidu.com");
CFHostRef host = CFHostCreateWithName(CFAllocatorGetDefault(), hostString);
CFHostStartInfoResolution(host, kCFHostAddresses, NULL);
CFArrayRef addresses = CFHostGetAddressing(host, NULL);
for (int i = 0; i<CFArrayGetCount(addresses); i++) {
struct sockaddr_in * ip;
ip = (struct sockaddr_in *)CFDataGetBytePtr(CFArrayGetValueAtIndex(addresses, i));
printf("%s\n",inet_ntoa(ip->sin_addr));
}
CFHostRef对象操作相关方法解析如下:
//获取类型ID
CFTypeID CFHostGetTypeID(void);
//根据域名创建CFHostRef对象
CFHostRef CFHostCreateWithName(CFAllocatorRef __nullable allocator, CFStringRef hostname);
/*
根据地址创建CFHostRef对象
addr参数为sockaddr结构体数据
*/
CFHostRef CFHostCreateWithAddress(CFAllocatorRef __nullable allocator, CFDataRef addr);
//CFHostRef对象的复制
CFHostRef CFHostCreateCopy(CFAllocatorRef __nullable alloc, CFHostRef host);
//对指定主机进行信息预查找 返回值标明是否查找成功
Boolean CFHostStartInfoResolution(CFHostRef theHost, CFHostInfoType info, CFStreamError * __nullable error);
//获取主机的地址列表 数组中为sockaddr结构体数据
CFArrayRef CFHostGetAddressing(CFHostRef theHost, Boolean * __nullable hasBeenResolved);
//获取主机名列表
CFArrayRef CFHostGetNames(CFHostRef theHost, Boolean * __nullable hasBeenResolved);
//获取主机可达性信息
CFDataRef CFHostGetReachability(CFHostRef theHost, Boolean * __nullable hasBeenResolved);
//取消未完成的解析
解析类型枚举
typedef CF_ENUM(int, CFHostInfoType) {
//地址
kCFHostAddresses = 0,
//主机名
kCFHostNames = 1,
//可达性信息
kCFHostReachability = 2
};
void CFHostCancelInfoResolution(CFHostRef theHost, CFHostInfoType info);
//设置客户端回调
Boolean CFHostSetClient(CFHostRef theHost, CFHostClientCallBack __nullable clientCB, CFHostClientContext * __nullable clientContext);
//注册进Runloop
void CFHostScheduleWithRunLoop(CFHostRef theHost, CFRunLoopRef runLoop, CFStringRef runLoopMode);
//从Runloop中注销
void CFHostUnscheduleFromRunLoop(CFHostRef theHost, CFRunLoopRef runLoop, CFStringRef runLoopMode);
八、后续
上面介绍的内容更多还是关于使用CFNetWork框架进行HTTP或FTP请求的相关方法,其实CFNetWork框架中还提供了复杂的Bonjour服务功能,其与CFNetService相关,这部分内容后面有时间再进行整理总结吧。