CFNetwork编程1

来源:互联网 发布:淘宝的星期四官换机 编辑:程序博客网 时间:2024/05/16 17:18

学习ASIHTTPRequest的使用,是对apple提供的sdk 中CFNetwork的封装,实现了很多的功能。简单总结CFNetwork编程的基本内容。



包括 CFSocket类,CFStream类,CFHTTP类,CFFTP类。

CFStream:

CFReadStreamOpen(CFReadStreamRef ref);打开一个CFRedStream,就可以对其进行读,写等操作,这些操作会block,会suspend。可以通过在run loop中注册该stream可读、可写事件以及相应的callback函数,实现异步的读写。

CFStream内置支持SSL协议。

例:

CFWriteStreamRef myWriteStream =CFWriteStreamCreateWithFile(kCFAllocatorDefault, fileURL);CFWriteStreamOpen(myWriteStream);CFIndex numBytesRead;UInt8 buf[myReadBufferSize];numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf));CFReadStreamClose(myReadStream);CFRelease(myReadStream);myReadStream = NULL;

实现异步的收发:

CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, port, &myReadStream, NULL);//创建连接,myReadStream和指定Host//创建该流的contextCFStreamClientContext myContext = {0, myPtr, myRetain, myRelease, myCopyDesc};

// 注册读写该流相关的事件

CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered;if (CFReadStreamSetClient(myReadStream, registeredEvents, myCallBack, &myContext)){    CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(),kCFRunLoopCommonModes);}

// 发起连接,open。。。。

if (!CFReadStreamOpen(myReadStream)) {    CFStreamError myErr = CFReadStreamGetError(myReadStream);    if (myErr.error != 0) {    // An error has occurred.        if (myErr.domain == kCFStreamErrorDomainPOSIX) {        // Interpret myErr.error as a UNIX errno.            strerror(myErr.error);        } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) {            OSStatus macError = (OSStatus)myErr.error;            }        // Check other domains.    } else        // start the run loop        CFRunLoopRun();}

callback的定义

void myCallBack (CFReadStreamRef stream, CFStreamEventType event, void *myPtr) {    switch(event) {        case kCFStreamEventHasBytesAvailable:        .....            UInt8 buf[BUFSIZE];            CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE);.....            break;        case kCFStreamEventErrorOccurred:            CFStreamError error = CFReadStreamGetError(stream);            reportError(error);            CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(),                                              kCFRunLoopCommonModes);            CFReadStreamClose(stream);            CFRelease(stream);            break;        case kCFStreamEventEndEncountered:            reportCompletion();            CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(),                                              kCFRunLoopCommonModes);            CFReadStreamClose(stream);            CFRelease(stream);            break;    }}

还有的方法是POLL,轮询

// 详细可参照

http://developer.apple.com/LIBRARY/IOS/#documentation/Networking/Conceptual/CFNetwork/CFStreamTasks/CFStreamTasks.html#//apple_ref/doc/uid/TP30001132-CH6-DontLinkElementID_12






原创粉丝点击