- 浏览: 569979 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
JYY282:
[i][/i]
Ecshop与Shopex的比较 -
qq247890212:
我也遇见这问题了,真诡异。重新下载个猫换了就好了。 太浪费时间 ...
诡异:ClassNotFoundException: org.springframework.web.filter.CharacterEncoding
From: http://www.writecodes.com/develop/343.html
在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket。这里要做一个简单的socket普及,这里包含在socket的设置非阻塞喝超时的控制逻辑,心跳包和线程的启动时间同步的控制。
这里都是标准的linux的流程,先创建一个socket:
1 2 3 4 5 6 7 8 9 |
- (int)CSocket { if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { perror("socket"); exit(errno); } return sockfd; } |
然后是链接:
1 2 3 4 5 6 7 8 9 10 |
- (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; } |
这样子的链接是阻塞的,这样子就比较不好,可以设置成非阻塞的方式来控制超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//在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设置超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
//设置超时 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两种方法都可以,你需要自己维护一个队列,控制时间等等
1 2 3 4 5 6 7 8 |
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都可以,这是方法,你需要自己维护一个队列,控制时间等等。
1 2 3 4 5 6 7 8 9 10 11 |
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); |
获取时间后就可以进行时间同步了,具体的时间同步协议要根据自己平台来设计
1 2 3 4 5 6 7 8 9 10 11 12 |
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必须是全局可用的,因为新线程已经不在主循环了,还有如果有界面更新也需要在主线程更新
1 |
[NSThread detachNewThreadSelector:@selector(OnNewThread) toTarget:self withObject:nil]; |
可以用timer做一个心跳包维持通讯
1 |
timer = [NSTimer scheduledTimerWithTimeInterval:2 target:selfselector:@selector(OnHeartBeatTimer:) userInfo:nil repeats:YES]; |
结束的时候记得关掉定时器和socket
1 2 |
[timer invalidate]; close(sockfd); |
本文出自 “ArthurChen” 博客:http://arthurchen.blog.51cto.com/2483760/577911
发表评论
-
Objective-C 与 C++ 的异同
2013-04-02 12:03 1358http://www.cnblogs.com/y041039 ... -
Cocos2D-X是全球知名的开源跨平台手机游戏引擎
2013-01-22 10:05 2710http://www.oschina.net/p/cocos ... -
iOS Keyboard 键盘高度变化 自适应
2013-01-15 15:43 3219[[NSNotificationCenter default ... -
iOS使用自定义字体
2012-11-27 12:11 12077From: http://blog.csdn.net/csy1 ... -
4 款类似 Facebook/Path 切换效果的 iOS 组件
2012-11-27 12:03 2091From: http://blog.csdn.net/lia ... -
Path 2.0的UI界面设计详细介绍
2012-11-27 11:56 1427如Path的创始人Dave Morin ... -
史上最全的App Store邮箱列表
2012-11-27 11:51 1223From: http://roybaby.blog.51cto ... -
iOS从info.plist 获取项目的名称及版本号
2012-11-16 10:54 1576From: http://blog.sina.com.cn/s ... -
MapKit annotation drag and drop with callout info update
2012-10-13 10:38 2364http://hollowout.blogspot ... -
NSArray 或NSDictionary 调用writeToFile方法失败原因
2012-08-31 10:03 4423NSArray 或NSDictionary 调用writeTo ... -
如何让IOS应用从容地崩溃
2012-08-30 15:25 1572From: http://www.cocoachina.com ... -
iOS中判断设备系统版本
2012-08-29 17:17 31669在iOS开发中,经常要考虑系统的向下兼容,如果使用 ... -
iOS 汉字转拼音
2012-08-21 16:42 1425From: http://www.cnblogs.com/v2 ... -
iOS模拟器截图工具
2012-08-17 16:35 1585From: http://magicalboy.com/ios ... -
XCode下的iOS单元测试
2012-08-10 17:47 1121From: http://mobile.51cto.com/ ... -
AFNetworking
2012-08-08 10:54 4622AFNetworking on github: https:/ ... -
Wrapping Conventions
2012-08-01 15:54 781Wrapping Conventions ... -
Core Animation如何使显式动画结束时的值直接作用Layer
2012-08-01 14:51 3750(1)使用隐式动画会直接改变layer的属性值,如: ima ... -
How To Debug Memory Leaks with XCode and Instruments Tutoria
2012-07-31 16:30 1019From: http://www.raywenderlich. ... -
Using Properties in Objective-C Tutorial
2012-07-31 16:27 881From: http://www.raywenderlich. ...
相关推荐
iphoneos-arm iPhone 必备工具
使用objective-c语言实现的socket,有iphone平台下的,也有mac平台下的。对加深ios socket编程有一定帮助。
iPhone开发-全校公选课考试题.doc
ios iphone开发-内存管理 所有权是iPhone内存管理的核心思想,对象的所有者负责在使用完对象后进行释放。一个对象可以有多个所有者,当它没有所有者时将被设置为取消分配(deallocation)
iOS网络高级编程 iPhone和iPad的企业应用开发--高清版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
iphone 开发-一个带索引和搜索功能的tableview例子,清晰的展示了功能实现的方法,简单易懂。
iphone 游戏中,实现手柄功能,代码样例
iPhone应用程序编程指南-中文版 pdf iPhone应用程序编程指南-中文版 pdf iPhone应用程序编程指南-中文版 pdf
NULL 博文链接:https://android-zhang.iteye.com/blog/1759395
ios方面的计算器程序,通过这个程序我们至少可以学会基于视图的应用程序开发的流程(定义输入口和操作、连接到Interface Builder、实现我们的程序逻辑等),掌握了Xcode、InterfaceBuilder和模拟器之间的配合开发。
cydia_1.0.3366-1_iphoneos-arm-安装包-图标不见了
iPhone6-4.7英寸-pcb设计图,
让不懂编程的人爱上iPhone开发002.pdf
iphone开发过程中控件的使用方法的源代码 包括了所有控件
知易Cocos2D-iPhone开发教程-08知易Cocos2D-iPhone开发教程-08
①-iphone应用程序开发-iPhoneAppProgrammingGuide|iphone开发
iPhone开发秘籍---第二版
iphone开发中,导航和tabbar的结合使用,代码样例。
mobilesubstrate_0.9.3999.1_iphoneos-arm
iPhone笔记-Object-c基础总结