IPhone网络编程.doc_第1页
IPhone网络编程.doc_第2页
IPhone网络编程.doc_第3页
IPhone网络编程.doc_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iphone socket开发在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket。这里要做一个简单的socket普及,这里包含在socket的设置非阻塞喝超时的控制逻辑,心跳包和线程的启动时间同步的控制。这里都是标准的linux的流程先创建一个socket- (int)CSocketif(sockfd = socket(AF_INET, SOCK_STREAM,0) = -1)perror(socket);exit(errno);returnsockfd;然后是链接/- (BOOL)ConnectToServer:(NSString*)addr port:(int)porttheir_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);intconn = connect(sockfd, (structsockaddr*)&their_addr,sizeof(structsockaddr);NSLog(Connect error no is %d:,conn);returnmisConnect;这样子的链接是阻塞的,这样子就比较不好,可以设置成非阻塞的方式来控制超时/*/在connect之前,设成非阻塞模式intflags = 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_setfdwrite;structtimevaltvSelect;FD_ZERO(&fdwrite);FD_SET(sockfd, &fdwrite);tvSelect.tv_sec =2;tvSelect.tv_usec =0;intretval = select(sockfd +1,NULL, &fdwrite,NULL, &tvSelect);if(retval 0)misConnect =YES;/*/在connect成功之后,设成阻塞模式flags = fcntl(sockfd, F_GETFL,0);flags &= O_NONBLOCK;fcntl(sockfd,F_SETFL, flags);/*/设置不被SIGPIPE信号中断,物理链路损坏时才不会导致程序直接被Terminate/在网络异常的时候如果程序收到SIGPIRE是会直接被退出的。structsigaction 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都可以,这是方法,你需要自己维护一个队列,控制时间等等。charreadBuffer512 = 0;NSString* readString =nil;intbr =0;while(br = read(sockfd, readBuffer,sizeof(readBuffer) sizeof(readBuffer)/while(br = recv(sockfd, readBuffer, sizeof(readBuffer), 0) tm_wday =0)wday =7;elsewday = p-tm_wday;chardata256 = 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:selfwithObject:nil;可以用timer做一个心跳包维持通讯timer = NSTimer scheduledTimerWithTimeInter

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论