`
473687880
  • 浏览: 535851 次
文章分类
社区版块
存档分类
最新评论

ios编程笔记:CFSocket

 
阅读更多

ios编程笔记:CFSocket(服务端)

主要函数:

第一步:创建

CFSocketRefCFSocketCreate(

CFAllocatorRef allocator, //内存分配类型一般为默认KCFAllocatorDefault

SInt32 protocolFamily, //协议族,一般为Ipv4:PF_INET,(Ipv6,PF_INET6)

SInt32 socketType,//套接字类型TCP:SOCK_STREAM

UDP:SOCK_DGRAM

SInt32 protocol,//套接字协议TCP:IPPROTO_TCP

UDP:IPPROTO_UDP;

CFOptionFlags callBackTypes, //回调事件触发类型

Enum CFSocketCallBACKType{

KCFSocketNoCallBack = 0,

KCFSocketReadCallBack =1,

KCFSocketAcceptCallBack= 2,(常用)

KCFSocketDtatCallBack = 3,

KCFSocketConnectCallBack = 4,

KCFSocketWriteCallBack = 8

}

CFSocketCallBack callout,//触发时调用的函数

Const CFSocketContext *context //用户定义数据指针

)

假设_socket = CFSocketCreate(….);

第二步:初始化

int yes = 1 ;

setsocketopt(

CFSocketGetNative(_socket),//返回系统原生套接字,补齐缺省

SOL_SOCKET,

SO_REUSEADDR,

(void*)&yes,

sizeof(yes)

)//对socket进行定义设置

第三步:地址

uint16_t port = 12345;

structsockaddr_in addr4;//定义监听地址以及端口

memset(&addr4 , 0,sizeof (addr4));

addr4.sin_len =sizeof (addr4);

addr4.sin_family =AF_INET;

addr4.sin_port =htons(port)

addr4.sin_addr.s_addr = htonl(INADDR_ANY);

CFData Ref address =CFDataCreate(

kCFAllocatorDefault,

(UInt8 *)&addr4,

sizeof (addr4),

)

intrst = CFSocketSetAddress(_socket,&addr4);

//将设置数据设入socket

If ( rst !=KCFSocketSuccess)

{…}

第四步:执行

CFRunLoopRefcfrl =CFRunLoopGetCurrent();

//获取当前的运行循环

CFRunLoopSourceRefsourceRef=

CFSoceketCreateRunLoopSource(KCFAllocatorDefault,_socket,0);

//创建一个运行循环源对象

CFRunLoopSource(cfrl , sourceRef,KCFRunLoopCommonModes);

//以该对象运行到当前运行循环中

CFRelease(sourceRef);

服务端响应

CFSocketCallBack callout,//触发时调用的函数

该函数会在接收到客户端请求连接时触发:

ServerAcceptCallBack(//名字可以任意取,但参数是固定的

CFSoceketRefsocket,

CFSocketCallBackType callbacktype,

CFDataRefaddress,

const void * data,//与回调函数有关的特殊数据指针,

对于接受连接请求事件,这个指针指向该socket的句柄,

对于连接事件,则指向Sint32类型的错误代码

void*info)//与套接字关联的自定义的任意数据

{ //实现函数

If(kCFSocketAcceptCallBack= = type ){

CFSocketNativeHandlenativeSocketHandle = (CFSocketNativeHandle*)data;

//////////////////////以下片段用于输出来访者地址

Uint8_t name[SOCK_MAXADDRLEN]

Socklen_t namelen = sizeof(name);

If(0 != getpeername(nativeSocketHandle ,(struct sockaddr_in*)name,&namelen)) //获取地址

{

exit(1)

}

Printf(“%s connected\n”,inet_ntoa((struct sockaddr_in *)name)->sin_addr);

//////////////////////

CFReadStreamRefiStream;

CFWriteStreamRefoStream;

CFStreamCreatePairWithSocket(//创建一个可读写的socket连接

kCFAllocatorDefault,

nativeSocketHandle,

&iStream,

&oStream);

If(iStream && oStream){

CFStreamClinetContextstreamCtxt = {0,NULL, NULL, NULL, NULL};

If(!CFReadStreamSetClient(

iStream,

kCFStreamEventHasBytesAvailable//有可用数据则执行

readStream,//设置读取时候的函数

&steamCtxt))

{exit(1);}

If(!CFWriteStreamSetClient(//为流指定一个在运行循环中接受回调的客户端

oStream,

kCFStreamEventCanAcceptBytes,//输出流准备完毕,可输出

writeStream,//设置写入时候的函数

&steamCtxt))

{exit(1);}

}

}

}

读取流操作(触发式,被动技能)

readStream(CFReadStreamRefstream,CFStreamEventTypeeventType, void *client CallBackInfo)

{

UInt8 buff[255];

CFReadStreamRead(stream,buff,255); //将输入流中数据存入buff

Printf(“received %s”,buff);

}

CFWriteStreamRefoutputStream = NULL; //输出流

写入流操作(仍然被动技能,在输出流准备好的时候调用)

writeStream (CFWriteStreamRefstream,CFStreamEventTypeeventType, void *clientCallBackInfo)

{

outputStream = stream;//输出流被指定

}

//主动输出,在输出流准备好之后才能调用

FucForWrite()

{

UInt8 buff[] = “Hunter21,this is Overlord”;

If(outputStream != NULL)

{

CFWriteStreamWrite(outputStream,buff,strlen(buff)+1);

}

}

------------------------------------------------------------------------------------------

ios编程笔记:CFSocket(客户端)

CFSocketRef _socket;

-(void)Connect

{

//////////////////////创建套接字//////////////

CFSocketContextCTX = {0,NULL,NULL,NULL,NULL};

_socket =CFSocketCreate(

kCFAllocatorDefault,

PF_INET,

SOCK_STREAM,

IPPROTO_TCP,

kCFSocketConnectCallBack, // 类型,表示连接时调用

ServerConnectCallBack, // 调用的函数

)

////////////////////////////设置地址///////////////////

NSString *serverAddr = @"192.168.0.110";

struct sockaddr_in addr

memset(&addr , 0,sizeof(addr));

addr.sin_len = sizeof(addr);

addr.sin_family = AF_INET;

addr.sin_port = htons(12345);

addr.sin_addr.s_addr = inet_addr([serverAddr UTF8String]);

CFDataRef address =CFDataCreate(

kCFAllocatorDefault,

(UInt8*)&addr,

sizeof(addr));

/////////////////////////////执行连接/////////////////////

CFSocketConnectToAddress(_socket,address,-1);

CFRunLoopRefcfrl = CFRunLoopGetCurrent(); // 获取当前运行循环

CFRunLoopSourceRefsource = CFSocketCreateRunLoopSource(kCFAllocatorDefault,_socket,0);//定义循环对象

CFRunLoopAddSource(cfrl,source,kCFRunLoopCommonModes); //将循环对象加入当前循环中

CFRelease(source);

}

static void ServerConnectCallBack(

CFSocketRefsocket,

CFSocketCallBackTypetype,

CFDataRefaddress,

const void *data,

void * info)

{

if(data != NULL)

{

printf("connect").//服务器那边已经提过,连接事件时该指针用于存放报错

}

else

{

printf("connect success");

}

}

///////////////////监听来自服务器的信息///////////////////

-(void)ReadStream

{

char buffer[255];

while(recv(CFSocektGetNative(_socket),buffer,sizeof(buffer),0))

{

printf(buffer);

}

}

/////////////////////////发送信息给服务器////////////////////////

- (void) sendMessage

{
NSString *stringToSend = @"Overlord,this is Hunter21";
const char *data = [stringToSend UTF8String];
send(CFSocketGetNative(_socket), data, strlen(data) + 1, 0);
}


分享到:
评论

相关推荐

    移动互联网 iOS网络编程

    【移动互联网 iOS网络编程】是iOS应用开发中的一个重要领域,主要涉及如何使应用程序能够通过网络获取数据、与其他设备通信或提供网络服务。本篇将详细阐述iOS网络编程的基础知识、主流案例及其背后的理论。 首先,...

    iOS CFNetwork编程指南

    ### iOS CFNetwork编程指南知识点详解 #### CFNetwork框架概述 CFNetwork是苹果公司开发的一个核心服务框架,它为iOS开发者提供了一系列用于网络任务的API,使得处理网络通信变得更加容易和高效。CFNetwork框架...

    iOS Socket 编程介绍

    对于iOS应用,客户端可以选择使用NSStream、CFStream或BSD Socket进行Socket编程,而服务器端通常使用CFSocket或BSD Socket。NSStream和CFStream都是苹果提供的高级接口,封装了底层的Socket操作,提供了面向对象的...

    iOS网络编程模型.pdf

    iOS网络编程模型主要围绕着三个层次展开:Cocoa层、Core Foundation层以及OS层。Cocoa层是最上层,提供了一系列Objective-C API,包括URL访问(NSURL)、流(NSStream)、Bonjour服务发现、Game Kit以及WebKit,这些...

    ios-Socket通信.zip

    在iOS中,通常使用CFSocket或者第三方库如AsyncSocket来处理Socket通信。 AsyncSocket库由Rob Napier开发,它的主要特点包括: 1. **异步操作**:AsyncSocket支持非阻塞I/O,这意味着在等待数据时,程序不会被挂起...

    socket 编程

    Socket编程是计算机网络通信的核心技术之一,特别是在iOS开发中,Objective-C语言的Socket实现对于构建网络应用程序至关重要。本文将深入探讨Socket编程的基本概念、工作原理以及如何在Objective-C中进行客户端和...

    AsyncSocket IOS

    这个库由Jon Reid开发,并在开源社区中广受欢迎,因为它封装了底层的CFSocket API,使得开发者不必深入理解复杂的网络编程细节就能实现异步Socket通信。 AsyncSocket的核心特性包括: 1. **异步操作**:...

    ios-LJSocketServer.zip

    在iOS和Mac开发中,有时候我们需要在本地搭建服务器进行应用的测试或调试,"ios-LJSocketServer.zip" 提供的解决方案就是利用苹果的Core Foundation框架中的CFSocket、NSStream以及CFHTTPMessage来实现一个类似...

    100家企业iOS招聘需求整理

    根据给定的信息,我们可以整理出...通过以上知识点的总结,可以看出这些内容涵盖了iOS开发的核心技术点,包括语言基础、用户界面设计、网络编程、数据处理等方面。掌握这些知识点对于成为一名优秀的iOS开发者至关重要。

    iOS UDP Demo

    首先,我们需要了解iOS开发的基础知识,这通常涉及到Objective-C或Swift编程语言。在这个Demo中,可能是使用Objective-C编写,因为早期的iOS开发更常用此语言。开发者会使用苹果的Xcode集成开发环境(IDE)来创建和...

    IOS面试题2018总结188题

    - **CFSocket**:Core Foundation 框架中的 socket 类,用于网络通信。 - **NSStream**:Foundation 框架中的流类,提供了更高级别的抽象。 #### 23. XML解析 - **NSXMLParser**:用于解析 XML 数据。 - **...

    a sample program of cfSocket source code is strictly prohibi

    3. **网络通信类**: 这可能指的是cfSocket是一个面向对象编程中的类库,专注于网络通信功能,如TCP/IP协议、套接字编程等。此类库通常包含一系列类和方法,方便开发者构建网络应用,如服务器和客户端。 4. **资源**...

    IOS应用源码——socket通讯.zip

    在iOS开发中,Socket通信是一种基础且重要的网络编程技术,用于设备间的双向通信。这份"IOS应用源码——socket通讯.zip"包含的源代码提供了一个实际的示例,帮助开发者理解如何在iOS应用中实现Socket通信。以下是...

    ios聊天界面/图库图片选择/View弹出/UDP使用/地图

    1. **聊天界面**:iOS中的聊天界面通常使用`UITableView`或`UICollectionView`来展示消息列表,每个单元格显示一条消息内容。为了实现发送和接收消息的功能,开发者通常会用到`AVFoundation`框架处理音频和视频,`...

    iOS开发教程Socket的原理和使用.docx

    在iOS开发中,网络编程是不可或缺的一部分,而Socket编程则是网络编程的基础。Socket提供了一个接口,让应用程序能够通过TCP/IP协议族进行通信。本文主要讲解iOS下Socket的原理和使用。 首先,了解iOS网络编程的...

    IOSpingIp地址

    在iOS系统中,尽管不像在命令行界面那样直接提供ping工具,但开发者可以通过编程的方式来实现这一功能。例如,提供的"STPingTest-master"可能是一个iOS应用程序的源代码,它实现了ping功能。这个应用程序可能是为iOS...

    ios系统软件开发介绍

    而Cocoa Touch是开发者最常打交道的部分,它包含面向对象的编程接口和UIKit,用于创建可视化应用界面。 对于Windows程序在iOS平台运行的可行性,通常分为B/S(Browser/Server)架构和C/S(Client/Server)架构。B/S...

    iOS中UDP通信

    在iOS中实现UDP通信,主要涉及CFNetwork框架中的CFSocket API或者使用更高层次的GCDAsyncSocket库。以下是一些关键概念和步骤: 1. **创建Socket**:首先,需要创建一个UDP套接字,可以使用CFSocketCreate函数,...

    Reachablity检测网络状态 包含代码

    Reachability类最初由Apple提供,它基于CFSocket和CFNetwork框架,可以帮助开发者监控网络连接的变化。在iOS应用中,了解网络状态对于确保应用的正常运行至关重要,比如在用户尝试发送网络请求时,如果网络不可用,...

    cocoaasyncsocket

    AsyncSocket的设计目标是简化socket编程,通过Objective-C的委托(Delegate)模式,使开发者能够轻松地在iOS应用中实现复杂的网络通信任务。 首先,我们要理解TCP/IP协议。TCP(传输控制协议)是一种面向连接的、...

Global site tag (gtag.js) - Google Analytics