//實現都是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);
}