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

//监测网络状态(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;
}

转载于:https://my.oschina.net/u/2501648/blog/542933

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: TCP/IP是一种通信协议,它包含了客户端服务端两个角色。客户端服务端通过TCP/IP协议进行通信,实现数据的传输和交互。 客户端是指发起连接请求的一方。当客户端需要与服务端进行通信时,它会首先向服务端发起连接请求。客户端在发送请求时,需要提供服务端的地址和端口号。一旦连接建立成功,客户端可以通过发送请求报文来向服务端发送数据请求。客户端还可以接收服务端响应的数据,以便进行后续处理。在数据传输结束后,客户端可以选择关闭连接,释放资源。 服务端是指接收并处理连接请求的一方。服务端监听指定的端口,并等待客户端的连接请求。当服务端接收到连接请求后,会建立一个与客户端的连接。一旦连接建立,服务端可以接收客户端发送的请求数据,并进行相应的处理。处理完成后,服务端会生成响应数据,并发送给客户端服务端客户端可以通过多次的请求响应交互来进行数据的传输和处理。最后,服务端可以主动关闭连接,释放资源。 TCP/IP客户端服务端之间的通信具有可靠性和顺序性。TCP协议保证了数据传输的可靠性,即在传输过程中不会丢失数据或产生错乱。而IP协议则负责将数据包传输到目标地址。客户端服务端之间的通信是基于可靠的连接进行的,通过TCP协议进行数据传输。数据按照顺序在客户端服务端之间传输,确保了数据的有效性和完整性。 总之,TCP/IP客户端服务端通过可靠的连接和顺序传输实现数据的交互和传输。这种通信方式在互联网上广泛应用,例如浏览器与服务器之间的通信、远程登录等。 ### 回答2: TCP/IP客户端服务端是指在TCP/IP网络中进行通信的两个角色。TCP/IP是互联网所使用的通信协议,它提供了可靠的、无连接的通信。 客户端是指请求并接收服务的一方。客户端通常由应用程序或者用户发起,它向服务器发起请求,并等待服务器的响应。客户端主动与服务器建立连接,并发送请求报文给服务器。在建立连接后,客户端可以将请求数据发送给服务器,并等待服务器的响应。客户端可以是个人电脑、手机、平板电脑等设备,通过应用程序与服务端进行通信。 服务端是指提供服务的一方。服务端运行在服务器上,并等待客户端的连接请求。一旦接收到客户端的请求,服务端会根据请求内容进行相应的处理,并将处理结果返回给客户端服务端可以是网络服务器、数据库服务器、邮件服务器等,它通过应用程序接收和处理客户端请求,并返回相应的结果给客户端。 TCP/IP客户端服务端之间的通信过程分为三个阶段:建立连接阶段、数据传输阶段和连接关闭阶段。在建立连接阶段,客户端发起连接请求,服务端接受请求并与客户端建立连接。在数据传输阶段,客户端可以将需要发送的数据通过连接发送给服务端服务端接收并处理数据,并将处理结果返回给客户端。在连接关闭阶段,客户端服务端可以选择关闭连接,结束通信。 总之,TCP/IP客户端服务端是互联网通信的两个主要角色,客户端发起请求并接收服务,而服务端接受请求并提供相应的服务。通过TCP/IP协议,客户端服务端可以进行可靠的、无连接的通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值