前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >监测网络状态(AFNetworking) 服务端 客户端

监测网络状态(AFNetworking) 服务端 客户端

原创
作者头像
用户7108768
修改2021-10-29 11:51:33
1K0
修改2021-10-29 11:51:33
举报
//监测网络状态(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;
}
</pre> 

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
NAT 网关
NAT 网关(NAT Gateway)提供 IP 地址转换服务,为腾讯云内资源提供高性能的 Internet 访问服务。通过 NAT 网关,在腾讯云上的资源可以更安全的访问 Internet,保护私有网络信息不直接暴露公网;您也可以通过 NAT 网关实现海量的公网访问,最大支持1000万以上的并发连接数;NAT 网关还支持 IP 级流量管控,可实时查看流量数据,帮助您快速定位异常流量,排查网络故障。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档