IOS開發之檢視網路鏈結是否可用

2021-06-09 13:47:13 字數 3036 閱讀 1549

在ios開發中我們經常用到網路,網路是不可或缺的,有網路連線和沒有網路連線的時候進行不同的處理,斷點續傳等等都離不開網路檢測。今天我自己簡單的做了乙個demo,用乙個函式封裝網路檢測;

-(bool)networki***istence

bool flagsreachable = ((flags & kscnetworkflagsreachable) != 0);

bool connectionrequired = ((flags & kscnetworkflagsconnectionrequired) != 0);

return (flagsreachable && !connectionrequired) ? yes : no;}

struct sockaddr_in ;

sin_family指代協議族,在socket程式設計中只能是af_inet

sin_port儲存埠號(使用網路位元組順序)

sin_addr儲存ip位址,使用in_addr這個資料結構

sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。

sin_addr按照網路位元組順序儲存ip位址

sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指標也可以指向sockaddr的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的資訊,然後用進行型別轉換就可以了

bzero((char*)&mysock,sizeof(mysock));//初始化

sockaddr_in mysock;

bzero((char*)&mysock,sizeof(mysock));

mysock.sa_family=af_inet;

mysock.sin_port=htons(1234);//1234是埠號

mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

上面我們提到sockaddr,現在我也簡單的說一下

struct sockaddr ;  sa_family是位址家族,一般都是「af_***」的形式。通常大多用的是都是af_inet,代表tcp/ip協議族。  sa_data是14位元組協議位址。  這個資料結構用做bind、connect、recvfrom、sendto等函式的引數,指明位址資訊。但一般程式設計中並不直接針對此資料結構操作,而是使用另乙個與sockaddr等價的資料結構,就是我們上面提到的sockaddr_in;

上面我們還提到了乙個資料結構struct in_addr  sin_addr,這裡也簡單的介紹一下

typedef struct in_addr s_un_b;

struct s_un_w;

struct s_un;

} in_addr;

結構體in_addr 用來表示乙個32位的ipv4位址.

in_addr_t 一般為 32位的unsigned long.

其中每8位代表乙個ip位址位中的乙個數值.

例如192.168.3.144記為0xc0a80390,其中b1 為192 ,b2 為 168, b3 為 3 , b4 為 144

上面我們講解了如何獲取網路狀態與sock的簡單介紹,你大概對socket有一點了解,詳細的可以看看其他的資料,下面介紹ios的

scnetworkreachability類的應用,在ios中systemconfiguration框架包含聯網相關的函式,可以檢查網路連線狀態。在

scnetworkreachability.h定義測試網路連線狀態的函式

,具體看下面:

一:建立測試網路引用

(1)scnetworkreachabilityref       scnetworkreachabilitycreatewithaddress (     //根據傳入的位址建立網路連線

引用cfallocatorref allocator,                        //可以為null或kcfallocatordefault

const struct sockaddr *address  //需要測試連線的ip位址

);    

注意:當

address

為0.0.0.0時則可以查詢本機的網路連線狀態。同時返回乙個引用必須在用完後釋放。

(2)scnetworkreachabilityref     scnetworkreachabilitycreatewithname (         //根據傳入的**建立

網路連線

引用cfallocatorref allocator,//可以為null或kcfallocatordefault

const char *nodename//比如為"www.baidu.com",此引數為網域名稱

);    

注意:當

address

為0.0.0.0時則可以查詢本機的網路連線狀態。同時返回乙個引用必須在用完後釋放。

釋放用 

cfrelease

(scnetworkreachabilityref  ref );

二:獲取網路連線狀態(是否存在網路連線):

boolean scnetworkreachabilitygetflags (          //用來獲得

網路連線的狀態

scnetworkreachabilityref target,//之前建立的

網路連線的引用

scnetworkreachabilityflags *flags//儲存確定連線是否獲得的狀態

);   

scnetworkreachabilityflags:儲存返回的測試連線狀態

其中常用的狀態有:

kscnetworkreachabilityflagsreachable:能夠連線網路

kscnetworkreachabilityflagsconnectionrequired:能夠連線網路,但是首先得建立連線過程

kscnetworkreachabilityflagsiswwan:判斷是否通過蜂窩網覆蓋的連線,比如edge,gprs或者目前的3g.主要是區別通過wifi的連線。

IOS開發之檢視網路鏈結是否可用 第二講

struct sockaddr in sin family指代協議族,在socket程式設計中只能是af inet sin port儲存埠號 使用網路位元組順序 sin addr儲存ip位址,使用in addr這個資料結構 sin zero是為了讓sockaddr與sockaddr in兩個資料結構...

IOS開發之 網路應用

nsdata foundation nsurl nsurlrequest nsurlconeection nsnetservice nsnetservicebrowser core foundation cfnetwork cfnetservice bsd sockets 1 獲取 nsdata d...

ios開發之網路基礎

1 網路訪問的步驟 1 建立nsurl 2 建立nsurlrequest 3 建立nsurlconnection 4 開始連線 1 void viewdidload 2 5 通過 nsurlconnectiondatadelegate方法處理網路請求的資料 1 伺服器響應,表示伺服器處理完成請求,準...