iphone socket 开发

在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket。

这里要做一个简单的socket普及,这里包含在socket的设置非阻塞喝超时的控制逻辑,心跳包和线程的启动时间同步的控制。

这里都是标准的linux的流程

先创建一个socket

- (int)CSocket

{

if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)

{

perror("socket");

exit(errno);

}

return sockfd;

}

然后是链接

//

- (BOOL)ConnectToServer:(NSString*)addr port:(int)port

{

their_addr.sin_family = AF_INET;

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

their_addr.sin_port = htons(port);

bzero(&(their_addr.sin_zero), 8);

int conn = connect(sockfd, (struct sockaddr*)&their_addr, sizeof(struct sockaddr));

NSLog(@"Connect error no is %d:",conn);

return misConnect;

}

这样子的链接是阻塞的,这样子就比较不好,可以设置成非阻塞的方式来控制超时

/***************************************************/

//在connect之前,设成非阻塞模式

int flags = fcntl(sockfd, F_GETFL,0);

fcntl(sockfd,F_SETFL, flags | O_NONBLOCK);

/***************************************************

//这是另外一种设置成非阻塞的方式

int flags;

if((flags = fcntl(sockfd, F_GETFL)) < 0 )

{

perror("fcntl F_SETFL");

}

flags |= O_NONBLOCK;

if(fcntl(sockfd, F_SETFL,flags) < 0)

{

perror("fcntl");

}

****************************************************/

设置connect后可以设置用select设置超时

/***************************************************/

//设置超时

fd_set          fdwrite;

struct timeval  tvSelect;

FD_ZERO(&fdwrite);

FD_SET(sockfd, &fdwrite);

tvSelect.tv_sec = 2;

tvSelect.tv_usec = 0;

int retval = select(sockfd + 1,NULL, &fdwrite, NULL, &tvSelect);

if(retval < 0)

{

if ( errno == EINTR )

{

NSLog(@"select error");

}

else

{

NSLog(@"error");

close(sockfd);

}

}

else if(retval == 0)

{

NSLog(@"select timeout........");

}

else if(retval > 0)

{

misConnect = YES;

}

/***************************************************/

//在connect成功之后,设成阻塞模式

flags = fcntl(sockfd, F_GETFL,0);

flags &= ~ O_NONBLOCK;

fcntl(sockfd,F_SETFL, flags);

/***************************************************/

//设置不被SIGPIPE信号中断,物理链路损坏时才不会导致程序直接被Terminate

//在网络异常的时候如果程序收到SIGPIRE是会直接被退出的。

struct sigaction sa;

sa.sa_handler = SIG_IGN;

sigaction( SIGPIPE, &sa, 0 );

/***************************************************/

然后就可以收发数据了

send,write两种方法都可以,你需要自己维护一个队列,控制时间等等

NSString *str = [SendCmdArray objectAtIndex:0];

NSData *data = [str dataUsingEncoding:NSISOLatin1StringEncoding];

//  ssize_t datalen = send(sockfd,[data bytes],[data length],0);

ssize_t datalen = write(sockfd, [data bytes], [data length]);

if(datalen == [data length])

{

NSLog(@"Send str:%@",str);

}

如何接收数据,read和recv都可以,这是方法,你需要自己维护一个队列,控制时间等等。

char readBuffer[512] = {0};

NSString* readString = nil;

int br = 0;

while (br = read(sockfd, readBuffer, sizeof(readBuffer)) < sizeof(readBuffer))

//  while((br = recv(sockfd, readBuffer, sizeof(readBuffer), 0)) < sizeof(readBuffer))

{

NSLog(@"Received CMD:%s",readBuffer);

readString = [NSString stringWithUTF8String:readBuffer];

memset(readBuffer,0,sizeof(readBuffer));

}

NSLog(@"br is %d,receive exit.",br);

获取时间后就可以进行时间同步了,具体的时间同步协议要根据自己平台来设计

time_t timep;

struct tm *p;

time(&timep);

p = localtime(&timep);

int wday = -1;//return num is (0,6),the weekday range is (1,7)

if(p->tm_wday == 0)

wday = 7;

else

wday = p->tm_wday;

char data[256] = {0};

sprintf(data,"0E4007%02x%02x%02x%02x%02x%02x%02x",(1900+p->tm_year)%100,(1+p->tm_mon),p->tm_mday,p->tm_hour,p->tm_min,p->tm_sec,wday);

NSString *msgtime = [NSString stringWithUTF8String:data];

可以开一个线程来进行收发,处理相关的操作,想要多线程控制需要注意这个socket必须是全局可用的,因为新线程已经不在主循环了

还有如果有界面更新也需要在主线程更新

[NSThread detachNewThreadSelector:@selector(OnNewThread) toTarget:self withObject:nil];

可以用timer做一个心跳包维持通讯

timer = [NSTimer scheduledTimerWithTimeInterval:2 target:self selector:@selector(OnHeartBeatTimer:) userInfo:nil repeats:YES];

结束的时候记得关掉定时器和socket

[timer invalidate];

close(sockfd);

iphone开发之轻松搞定原生socket 编程,阻塞与非阻塞,收发自如相关推荐

  1. 基于MFC的socket编程(异步非阻塞通信)

    对于许多初学者来说,网络通信程序的开发,普遍的一个现象就是觉得难以入手.许多概念,诸如:同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)等,初学者往往迷惑不清,只知其 ...

  2. IPhone开发 用子类搞定不同的设备(iphone和ipad)

    用子类搞定不同的设备 因为要判断我们的程序正运行在哪个设备上,所以,我们的代码有些混乱了,IF来ELSE去的,记住,将来你花在维护代码上的时间要比花在写代码上的时间多,如果你的项目比较大,且IF语句分 ...

  3. c# socket接收字符串_socket通信很难?这一文让你轻松搞定!

    目录 概述 TCP/IP协议.UDP协议 Socket是什么 socket通信流程 socket编程php代码实战 php7进阶到架构师相关阅读 概述 这是关于php进阶到架构之php7核心技术与最佳 ...

  4. Iphone手机企业邮箱设置 九步轻松搞定

    Iphone手机企业邮箱设置 九步轻松搞定 随着IPhone4S.IPhone5.小米系列手机的爆棚热销,智能手机迅速成为我们生活必备品.智能手机的便捷性也是随时随地都能派上用场.轻便自不必说,电话沟 ...

  5. 熟练掌握skynet,后端开发丨游戏开发轻松搞定丨多线程丨多进程

    掌握skynet,后端开发原来如此简单 1. 多线程 2. 多进程 3. actor模型-skynet 4. csp模型 [技术分享篇]熟练掌握skynet,后端开发丨游戏开发轻松搞定丨多线程丨多进程 ...

  6. 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发详解

    转载请注明来源: http://blog.csdn.net/kjunchen/article/details/50909410 使用BleLib的轻松搞定Android低功耗蓝牙Ble 4.0开发详解 ...

  7. 网站被恶意镜像怎么办 php一段代码轻松搞定(全面版)

    有时候你会发现,你在搜索引擎输入网站名称的时候,出来的网站信息是你们的,但是域名却是一个陌生的,这种情况可以基本确定网站被镜像了,那么究竟什么叫网站被镜像? 恶意镜像,也叫恶意克隆,恶意解析,是指有人 ...

  8. 教你如何轻松搞定云上打印管理

    摘要:加快自主创新,满足数字化用户多场景文印需求. 本文分享自华为云社区<有了司印云打印,云上打印管理轻松搞定!>,作者:云商店 . 作为与职场和个人办公息息相关的工作场景,打印长期以来都 ...

  9. 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)

    轻松搞定表白女朋友:Android版软件 (零基础也可直接下载软件) 在我们平时生活当中,经常会看到一些表白女朋友的html网页,但是Android端的表白软件可以说是基本没有,笔者在全网搜了一下,就 ...

最新文章

  1. 在 Linux 终端调整图像的大小
  2. 科学家发现跨越生命的重要门槛或许没那么难
  3. 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略
  4. [云炬创业基础笔记]第四章测试21
  5. 基于hi-nginx的web开发(python篇)——utf-8编码
  6. android:由URL载入中ImageView
  7. c语言自定义输出小数点位数_C语言中输出时怎样控制小数点后的位数,请举例说明......
  8. NOIP2013普及组复赛试题_计数问题
  9. vba判断文件是否存在的两种方法
  10. 【Angular专题】——(1)Angular,孤傲的变革者
  11. python基础3——运算符
  12. Android事件分发 笔记
  13. srsLTE源码学习:网络附属存储抓包nas_pcap.h
  14. C++安全方向(三)3.4 使用哈希列表验证文件的完整性
  15. linux 修改php配置,PHP部署时的几个配置修改说明
  16. R中统计假设检验总结
  17. python logisticregression_Python机器学习sklearn LogisticRegression用户流失预测模型初探
  18. Installshield 静默安装
  19. 安装 FreeBSD-13.0-RELEASE-amd64
  20. java开发专用英语,JAVA开发常用英语词汇

热门文章

  1. opencv学习笔记(六)---图像梯度
  2. 5 网络层----IP协议相关技术
  3. css继承和边框圆角 及 写三角形
  4. We Chall-Training: Get Sourced-Writeup
  5. c# winform InvokeRequired 解决跨线程访问控件
  6. (笔记)Mysql命令grant on:增加新用户并控制其权限
  7. 谈谈CListCtrl如何调整行高
  8. 广告基本知识-广告的目的和效果
  9. GeoServer 数据导出
  10. Oracle 管道化表函数(Pipelined Table)[转载]