网络可达

+(Reachability*)reachabilityWithHostname:(NSString*)hostname

{

SCNetworkReachabilityRef ref = SCNetworkReachabilityCreateWithName(NULL, [hostname UTF8String]);//通过主机名初始化网络可达对象

if (ref)

{

id reachability = [[self alloc] initWithReachabilityRef:ref];

return reachability;

}

return nil;

}

-(Reachability *)initWithReachabilityRef:(SCNetworkReachabilityRef)ref

{

self = [super init];

if (self != nil)

{

self.reachableOnWWAN = YES;

self.reachabilityRef = ref;//网络可达对象的持有化

self.reachabilitySerialQueue = dispatch_queue_create("com.tonymillion.reachability", NULL);//网络可达的操作队列

}

return self;

}

-(BOOL)startNotifier//添加监听网络变化的通知

{

if(self.reachabilityObject && (self.reachabilityObject == self))//已经添加了通知

{

return YES;

}

SCNetworkReachabilityContext    context = { 0, NULL, NULL, NULL, NULL };//初始化上下文

context.info = (__bridge void *)self; //当前对象保存到info中

if(SCNetworkReachabilitySetCallback(self.reachabilityRef, TMReachabilityCallback, &context))//网络可达中设置了回调函数

{

if(SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, self.reachabilitySerialQueue))

{

self.reachabilityObject = self;//托管当前的类,便于销毁该对象时不会导致当前类销毁

return YES;

}

else

{

#ifdef DEBUG

NSLog(@"SCNetworkReachabilitySetDispatchQueue() failed: %s", SCErrorString(SCError()));

#endif

SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);

}

}

else//网络可达中没有设置了回调函数

{

#ifdef DEBUG

NSLog(@"SCNetworkReachabilitySetCallback() failed: %s", SCErrorString(SCError()));

#endif

}

self.reachabilityObject = nil;

return NO;

}

-(void)stopNotifier

{

SCNetworkReachabilitySetCallback(self.reachabilityRef, NULL, NULL);//移除网络可达通知中的上下文

SCNetworkReachabilitySetDispatchQueue(self.reachabilityRef, NULL);//移除网络可达通知中的队列

self.reachabilityObject = nil;//销毁指向当前类的对象

}

-(BOOL)isReachableViaWWAN

{

#if TARGET_OS_IPHONE

SCNetworkReachabilityFlags flags = 0;

if(SCNetworkReachabilityGetFlags(self.reachabilityRef, &flags))//获取网络可达状态标志

{

if(flags & kSCNetworkReachabilityFlagsReachable)

{

if(flags & kSCNetworkReachabilityFlagsIsWWAN)//标志位是3G网络下

{

return YES;

}

}

}

#endif

return NO;

}

时间: 2024-08-19 13:39:00

网络可达的相关文章

VMware与virtualbox安装centos7连接网络不可达问题解决笔记(连接网络)

我最初是安装vmware遇到访问不到网络,按网上的配置方法都不能解决.然后我感觉可能跟系统有关,我装的是centos,然后我试着在virtualbox上安装看遇到什么问题. 用virtualbox安装完centos后,网络设置也配置好了,可是不能连网,ping主机ip显示网络不可达.同vmware上遇到的问题一样.我觉得百分之八十跟系统有关,因为我之前安装其他系统没遇到这个问题.然后我参考的是百度经验地址.http://jingyan.baidu.com/article/456c463b4a98

Unity获取Android和iOS手机系统电量及网络状况

最开始考虑使用中间静态链接库来调用手机系统自带的API,但是在研究的过程中发现Android系统将电量等信息记录在了固定的文件中,所以只需要在C#中直接读取就可以而不需要中间库. a.Android版 1.通过C#直接读取,下面的GetBatteryLevel()方法 int GetBatteryLevel() { try { string CapacityString = System.IO.File.ReadAllText("/sys/class/power_supply/battery/c

IPV4因特网划分网络

A类ip地址范围  1.0.0.0-126.0.0.0  可用的A类网络有126个 B类ip地址范围  128.0.0.0-191.255.255.255  可用的B类网络有16382个 C类ip地址范围   192.0.0.0-223.255.255.255  C类网络可达209万余个 D类地址用于多点广播 使用IP地址和掩码进行逻辑与  即为网络地址

网络--路由表&IP选路

路由表的 flags 字段显示路由状态: A 活动的休眠网关检测在路由上被启用.本字段只适用于 AIX 5.1 或更新版本. U :Up. H :路由至主机而不是网络. G :路由至网关. 不带G表示不经过路由 D :路由通过重定向动态地创建. M :路由通过重定向被修改. L :链接级地址显示在路由项中. c :对该路由的访问创建克隆路由.本字段只适用于 AIX 4.2.1 或更新版本. W :该路由为克隆路由.本字段只适用于 AIX 4.2.1 或更新版本. 1 :协议特定路由标志 #1.

CCNA网络工程师学习进程(7)路由器的路由配置

    前面一节已经介绍了路由器的端口配置,接着我们介绍路由器的路由配置:静态路由.默认路由和浮动路由的配置:动态路由协议的配置,包括RIP.IGRP.EIGRP和OSPF.     (1)路由器的基础深入: 1)静态路由: 静态路由是指由用户或网络管理员手工配置的路由信息. 静态路由适用于:简单的网络环境和支持DDR(Dial-on-Demand Routing)的网络中. 在DDR(按需拨号路由选择)链路中,拨号链路只在需要时才拨通,因此不能为动态路由信息表提供路由信息的变更情况.DDR允许

【linux基础】17、TCP/IP网络基础(下)

一.IP地址 1.IANA IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配的机构.负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义. 2.IP地址的基本格式 IPv4使用32位(4字节)地址,因此整个地址空间中有4,294,967,296(2^32)个地址,也就是近43亿个地址.IPv4地址在计算机内部是以二进制形式表示,是一个32位的二进制数,通常被分割为4个"8位二进制数"(也就是4个字节). IP地

浅谈TCP/IP网络编程中socket的行为

我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: . TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) . Socket I/O系统调用(重点如read/write),这是TCP/IP协议在应用层表现出来的行为. . 编写Performant, Scalable的服务器程序.包括多线程.IO Multiplexing.非阻塞.异步等各种技术. 关于TCP/IP协议,建议参考Richard Stevens的<TCP/IP Illust

网络基础之二:ip地址

一.IP地址 IANA IANA 就是指(Internet Assigned Numbers Authority) ,Internet号分配的机构.负责对IP地址分配规划以及对TCP/UDP公共服务的端口定义. IP地址是一个32位的二进制数,通常被分割为4个"8位二进制数"(也就是4个字节). IP地址通常用"点分十进制"表示成(a.b.c.d)的形式,其中,a,b,c,d都是0~255之间的十进制整数. 例:点分十进IP地址(100.4.5.6),实际上是32位

关于HTTP协议跟TCP、IP协议到底在网络协议中的分层。

我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯规范,也就是因为双方要进行通讯,大家要事先约定一个规范. 1.连接 当我们输入这样一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把www.mycompany.com变成ip,如果url里不包含端口号,则会使用该协议的默认端口号.