//实现都是UNIX网络的编程,比较底层,可以考虑改为C,C++来单独写个可以跨平台的模块
+ (void) checkInfoWithCompleteHandler:(void(^)(NSString * ipAddress,
NSString * macAddress,
NSString * receiveDataShowString,
NSString * postDataShowString,
NSString * ssid))completeHandler {
/*
struct ifaddrs {
struct ifaddrs *ifa_next; // ifa_next指向链表的下一个成员
char *ifa_name; //ifa_name是接口名称
unsigned int ifa_flags; //ifa_flags是接口的标识位
struct sockaddr *ifa_addr;
struct sockaddr *ifa_netmask; //ifa_netmask存储该接口的子网掩码
struct sockaddr *ifa_dstaddr;
void *ifa_data; //ifa_data存储了该接口协议族的特殊信息,它通常是NULL(一般不关注他)
};
struct sockaddr_in {
__uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
*/
struct ifaddrs *ifa_list = 0, *ifa;
if (getifaddrs(&ifa_list) == -1) //函数getifaddrs(int getifaddrs (struct ifaddrs **__ifap))获取本地网络接口信息
//函数执行成功返回0,失败返回-1
{
return;
}
uint32_t iBytes = 0;
uint32_t oBytes = 0;
NSString * ipAddress;
for (ifa = ifa_list; ifa; ifa = ifa->ifa_next)
{
// if (AF_LINK != ifa->ifa_addr->sa_family)//链路地址协议
// continue;
if (!(ifa->ifa_flags & IFF_UP) && !(ifa->ifa_flags & IFF_RUNNING))// 就实际功用而言,两者都代表了网络装置是否正常启用,但是更仔细观察可以发现拔除网络线时会造成 IFF_RUNNING 的改变,至于 IFF_UP 不会因插拔网络线而有任何变化。
continue;
/* Not a loopback device. */
//IP Address
const char *ip = inet_ntoa(((struct sockaddr_in *)ifa->ifa_addr)->sin_addr);
if (!ipAddress || [ipAddress rangeOfString:@"192.168."].location == NSNotFound) {
ipAddress = [NSString stringWithCString:ip encoding:NSUTF8StringEncoding];
}
struct if_data *if_data = (struct if_data *)ifa->ifa_data;
if (if_data)
{
iBytes += if_data->ifi_ibytes;
oBytes += if_data->ifi_obytes;
}
}
NSString * iBytesString = [NSString stringWithFormat:@"%.2f MB",iBytes/1024.0/1024.0];
NSString * oBytesString = [NSString stringWithFormat:@"%.2f MB",oBytes/1024.0/1024.0];
NSString * macString = [NetEyeIII getMacAddress];
NSString * ssid = [NetEyeIII ssid];
if (completeHandler) {
completeHandler(ipAddress,macString,iBytesString,oBytesString,ssid);
}
freeifaddrs(ifa_list);
}