//監測網絡狀態(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;app

//客戶端框架

#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;
}

dom

相關文章
相關標籤/搜索