监测网络状态(AFNetworking) 服务端 客户端
2018-07-20 来源:open-open
//监测网络状态(AFNetworking) #import "ViewController.h" //引入第三方框架 #import "AFNetworking/AFNetworking.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; //检查网络状态 [self checkNetworkStates]; } #pragma mark 检查网络状态 -(void)checkNetworkStates{ //1.我们的创建一个用于测试的url NSURL * url = [NSURL URLWithString:@"http://www.apple.com"]; //2.建立一个操作管理 AFHTTPRequestOperationManager *operationManager = [[AFHTTPRequestOperationManager alloc]initWithBaseURL:url]; //3.根据不同的网络状态,去做相应的处理 [operationManager.reachabilityManager setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) { switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"网络未发现"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"通过wifi连接"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"通过2G/3G/4G连接"); break; case AFNetworkReachabilityStatusUnknown: NSLog(@"不明"); break; default: break; } }]; //开始监控(实时监听网络状态的变化) [operationManager.reachabilityManager startMonitoring]; } //服务端 #import <Foundation/Foundation.h> #include<sys/socket.h>//提供socket函数以及数据结构 #include<netinet/in.h>//定义数据结构 #include <arpa/inet.h>//提供IP地址转换函数 int main() { //服务器顺序: socket->bind->listen->while(true) accept -> do while recv ->close int fd = socket(AF_INET, SOCK_STREAM, 0);//协议不调用 BOOL success = (fd != -1); struct sockaddr_in addr;//表示服务端的 int err; //服务端地址设置 if(success){ NSLog(@"socket成功"); memset(&addr, 0, sizeof(addr)); addr.sin_len = sizeof(addr); addr.sin_family = AF_INET; addr.sin_port = htons(1024); addr.sin_addr.s_addr = INADDR_ANY; //进行绑定 err = bind(fd, (const struct sockaddr *)&addr, sizeof(addr)); success = (err == 0); } if(success){ NSLog(@"bind成功"); //listen监听 //第二个参数为等待接收的连接的队列的大小。比如在connect请求过来的时候,完成三次握手后先将连接放在队列中,直到被accept处理。如果这个队列满了,并且又有新的连接的时候,对方可能会收到错误信息(其实就是一个排队的过程,和采集的过程) err = listen(fd,5); success = (err == 0); } if(success){ NSLog(@"listen成功"); while(true){ struct sockaddr_in clientaddr; //定义一个客户端的套接字,用于获取接收到的客户端的套接字 int clientfd; //定义一个地址长度变量,接收客户端的长度 socklen_t addrLen; addrLen = sizeof(clientaddr); NSLog(@"准备接受"); //accept函数 //第二个参数用于返回客户端的协议地址。 //第三个参数为协议地址的长度 clientfd = accept(fd, (struct sockaddr *)&clientaddr, &addrLen); success = (clientfd!= -1); if (success) { char buf[1024]; ssize_t count;//用于接收函数的返回值 ssize_t len = sizeof(buf); do{ //recv() 成功返回实际读入缓冲的数据字节数,错误返回-1。 count = recv(clientfd,buf,len,0); if(count < 0){ NSLog(@"再见"); break; } //输出 NSString *str = [NSString stringWithCString:buf encoding:NSUTF8StringEncoding]; NSLog(@"%@",str); }while(strcmp(buf, "exit")!=0); } // clientaddr.sin_family = AF_INET; // clientaddr.sin_port = htons(1024); // clientaddr.sin_addr.s_addr =inet_addr("127.0.0.1"); //关闭客户端:只是关闭这个套接字特定的TCP连接 close(clientfd); } } return 0; //客户端 #import <Foundation/Foundation.h> #include<sys/socket.h>//提供socket函数以及数据结构 #include<netinet/in.h>//定义数据结构 #include <arpa/inet.h>//提供IP地址转换函数 int main() { //客户端顺序:Socket->bind->connect->send->close //创建一个套接字 //套接字:源ip地址和目的ip地址 以及 源端口号和目的端口号的组合。用于标示客户端请求的服务器。 //domain:定义域,目前只支持AF_INET(Internet的地址格式) //type:套接字类型描述。SOCK_STREAM流式(TCP),SOCK_DGRAM数据报式(UDP) //protocol:套接字所用协议,如不想指定,可用0表示 int fd = socket(AF_INET, SOCK_STREAM, 0); printf("%d\n",fd); //只要不等于-1,表示创建成功. BOOL success= (fd != -1); //sockaddr_in 是网络环境下套接字的地址形式 struct sockaddr_in addr; //创建一个整形变量,用于体现网络连接中的错误 int err; if(success){ printf("socket成功\n"); //内存初始化 //sizeof:计算数据空间字节数 memset(&addr,0,sizeof(addr)); //对addr结构体进行设置 addr.sin_family = AF_INET;//AF_INET通过Ipv4进行通信 //设置网络地址 addr.sin_addr.s_addr =INADDR_ANY;//INADDR_ANY指定地址为0.0.0.0的地址。表示一个不确定地址,或想象成一个“任意地址”。 //将socket与特定主机地址与端口号进行绑定,成功绑定会返回,失败也会 err = bind(fd, (const struct sockaddr *)&addr, sizeof(addr)); success = (err == 0);//if(err == 0){success = true;} } if (success) { printf("bind成功\n"); //创建要连接的服务器地址 struct sockaddr_in serveraddr; //内存初始化 memset(&serveraddr, 0, sizeof(serveraddr)); //设置结构体 (host to net short) serveraddr.sin_port = htons(1024);//将主机的无符号短整形转换成网络字节顺序 serveraddr.sin_len = sizeof(serveraddr); serveraddr.sin_family = AF_INET; //设置服务器地址 serveraddr.sin_addr.s_addr = inet_addr("127.0.0.1");//这个地址是本地,一般用来测试使用。 printf("连接中...\n"); //客户端向服务器发送连接请求,连接成功返回0,失败返回-1 err = connect(fd, (const struct sockaddr *)&serveraddr, sizeof(serveraddr)); success =(err == 0); socklen_t addrLen = sizeof(serveraddr);;//客户端地址长度 if(success){ printf("连接成功...\n"); //getsockname可以正确获得当前正在通信的socketIP端口等信息 getsockname(fd, (struct sockaddr *)&addr, &addrLen); success = (err == 0); //inet_ntoa:将一个IP转换成互联网标准点分格式的字符串 //ntohs:将网络字节顺序转换成主机字节顺序 printf("本地地址:%s,端口号:%d\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port)); //发送消息 char buf[1024]; do{ printf("请输入信息:"); // puts(buf); scanf("%s",buf); send(fd,buf,1024,0); }while (strcmp(buf, "exit")!=0);//当输入exit跳出循环,结束 } else { printf("连接失败...\n"); } } return 0; }
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点!
本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。
上一篇:Java随机生成6位数字
下一篇: JS回车提交表单
最新资讯
热门推荐