監測網絡狀態(AFNetworking) 服務端 客戶端

jopen 10年前發布 | 2K 次閱讀 Objective-C 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; } </pre>

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!