资源描述:
《IPhone网络编程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、iphonesocket 开发 在iphone的平台下,要进行socket开发其实有很多种的方法,开源的库Asyncsocket,官方的CFSocket,还有BSD的socket。这里要做一个简单的socket普及,这里包含在socket的设置非阻塞喝超时的控制逻辑,心跳包和线程的启动时间同步的控制。 这里都是标准的linux的流程先创建一个socket -(int)CSocket{ if((sockfd=socket(AF_INET,SOCK_STREAM, 0))==-1) { perror("socket");
2、 exit(errno); } return sockfd;}然后是链接//////////////////-(BOOL)ConnectToServer:(NSString*)addrport:(int)port{ their_addr.sin_family=AF_INET; their_addr.sin_addr.s_addr=inet_addr([addrUTF8String]); their_addr.sin_port=htons(port); bzero(&(their_addr.sin_zero
3、), 8); int conn=connect(sockfd,(struct sockaddr*)&their_addr, sizeof(struct sockaddr)); NSLog(@"Connecterrornois%d:",conn); return misConnect;} 这样子的链接是阻塞的,这样子就比较不好,可以设置成非阻塞的方式来控制超时 /***************************************************/ //在connect之前,设成非阻塞模式 int
4、 flags=fcntl(sockfd,F_GETFL,0); fcntl(sockfd,F_SETFL,flags
5、O_NONBLOCK); /*************************************************** //这是另外一种设置成非阻塞的方式 intflags; if((flags=fcntl(sockfd,F_GETFL))<0) { perror("fcntlF_SETFL"); } flags
6、=O_NONBLOCK; if(f
7、cntl(sockfd,F_SETFL,flags)<0) { perror("fcntl"); } ****************************************************/设置connect后可以设置用select设置超时/***************************************************/ //设置超时 fd_set fdwrite; struct timeval tvSelect; FD_ZER
8、O(&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(@"selecterror"); } else { NSLog(@"error
9、"); close(sockfd); } } else if(retval== 0) { NSLog(@"selecttimeout........"); } else if(retval> 0) { misConnect= YES; } /***************************************************/ //在connect成功之后,设成阻塞模式 flags=fcntl(sockfd,F_GETFL
10、,0); flags&=~O_NONBLOCK; fcntl(sockfd,F_SETFL,flags);