主要函数:
第一步:创建
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 CFNetwork编程指南知识点详解 #### CFNetwork框架概述 CFNetwork是苹果公司开发的一个核心服务框架,它为iOS开发者提供了一系列用于网络任务的API,使得处理网络通信变得更加容易和高效。CFNetwork框架...
对于iOS应用,客户端可以选择使用NSStream、CFStream或BSD Socket进行Socket编程,而服务器端通常使用CFSocket或BSD Socket。NSStream和CFStream都是苹果提供的高级接口,封装了底层的Socket操作,提供了面向对象的...
iOS网络编程模型主要围绕着三个层次展开:Cocoa层、Core Foundation层以及OS层。Cocoa层是最上层,提供了一系列Objective-C API,包括URL访问(NSURL)、流(NSStream)、Bonjour服务发现、Game Kit以及WebKit,这些...
在iOS中,通常使用CFSocket或者第三方库如AsyncSocket来处理Socket通信。 AsyncSocket库由Rob Napier开发,它的主要特点包括: 1. **异步操作**:AsyncSocket支持非阻塞I/O,这意味着在等待数据时,程序不会被挂起...
Socket编程是计算机网络通信的核心技术之一,特别是在iOS开发中,Objective-C语言的Socket实现对于构建网络应用程序至关重要。本文将深入探讨Socket编程的基本概念、工作原理以及如何在Objective-C中进行客户端和...
这个库由Jon Reid开发,并在开源社区中广受欢迎,因为它封装了底层的CFSocket API,使得开发者不必深入理解复杂的网络编程细节就能实现异步Socket通信。 AsyncSocket的核心特性包括: 1. **异步操作**:...
在iOS和Mac开发中,有时候我们需要在本地搭建服务器进行应用的测试或调试,"ios-LJSocketServer.zip" 提供的解决方案就是利用苹果的Core Foundation框架中的CFSocket、NSStream以及CFHTTPMessage来实现一个类似...
根据给定的信息,我们可以整理出...通过以上知识点的总结,可以看出这些内容涵盖了iOS开发的核心技术点,包括语言基础、用户界面设计、网络编程、数据处理等方面。掌握这些知识点对于成为一名优秀的iOS开发者至关重要。
首先,我们需要了解iOS开发的基础知识,这通常涉及到Objective-C或Swift编程语言。在这个Demo中,可能是使用Objective-C编写,因为早期的iOS开发更常用此语言。开发者会使用苹果的Xcode集成开发环境(IDE)来创建和...
- **CFSocket**:Core Foundation 框架中的 socket 类,用于网络通信。 - **NSStream**:Foundation 框架中的流类,提供了更高级别的抽象。 #### 23. XML解析 - **NSXMLParser**:用于解析 XML 数据。 - **...
3. **网络通信类**: 这可能指的是cfSocket是一个面向对象编程中的类库,专注于网络通信功能,如TCP/IP协议、套接字编程等。此类库通常包含一系列类和方法,方便开发者构建网络应用,如服务器和客户端。 4. **资源**...
在iOS开发中,Socket通信是一种基础且重要的网络编程技术,用于设备间的双向通信。这份"IOS应用源码——socket通讯.zip"包含的源代码提供了一个实际的示例,帮助开发者理解如何在iOS应用中实现Socket通信。以下是...
1. **聊天界面**:iOS中的聊天界面通常使用`UITableView`或`UICollectionView`来展示消息列表,每个单元格显示一条消息内容。为了实现发送和接收消息的功能,开发者通常会用到`AVFoundation`框架处理音频和视频,`...
在iOS开发中,网络编程是不可或缺的一部分,而Socket编程则是网络编程的基础。Socket提供了一个接口,让应用程序能够通过TCP/IP协议族进行通信。本文主要讲解iOS下Socket的原理和使用。 首先,了解iOS网络编程的...
在iOS系统中,尽管不像在命令行界面那样直接提供ping工具,但开发者可以通过编程的方式来实现这一功能。例如,提供的"STPingTest-master"可能是一个iOS应用程序的源代码,它实现了ping功能。这个应用程序可能是为iOS...
而Cocoa Touch是开发者最常打交道的部分,它包含面向对象的编程接口和UIKit,用于创建可视化应用界面。 对于Windows程序在iOS平台运行的可行性,通常分为B/S(Browser/Server)架构和C/S(Client/Server)架构。B/S...
在iOS中实现UDP通信,主要涉及CFNetwork框架中的CFSocket API或者使用更高层次的GCDAsyncSocket库。以下是一些关键概念和步骤: 1. **创建Socket**:首先,需要创建一个UDP套接字,可以使用CFSocketCreate函数,...
Reachability类最初由Apple提供,它基于CFSocket和CFNetwork框架,可以帮助开发者监控网络连接的变化。在iOS应用中,了解网络状态对于确保应用的正常运行至关重要,比如在用户尝试发送网络请求时,如果网络不可用,...
AsyncSocket的设计目标是简化socket编程,通过Objective-C的委托(Delegate)模式,使开发者能够轻松地在iOS应用中实现复杂的网络通信任务。 首先,我们要理解TCP/IP协议。TCP(传输控制协议)是一种面向连接的、...