監測網絡狀態(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) {
}]; //開始監控(實時監聽網絡狀態的變化) [operationManager.reachabilityManager startMonitoring]; }switch (status) { case AFNetworkReachabilityStatusNotReachable: NSLog(@"網絡未發現"); break; case AFNetworkReachabilityStatusReachableViaWiFi: NSLog(@"通過wifi連接"); break; case AFNetworkReachabilityStatusReachableViaWWAN: NSLog(@"通過2G/3G/4G連接"); break; case AFNetworkReachabilityStatusUnknown: NSLog(@"不明"); break; default: break; }
//服務端
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>