Дело в том, что pdp_ip0
является одним из интерфейсов, все pdpXXX
являются WWAN
интерфейсами, предназначенными для различных функций, голосовой почты, общего сетевого интерфейса.
Я читал на форуме Apple, что: ОСне ведет сетевую статистику для каждого процесса отдельно.Таким образом, нет точного решения этой проблемы.Однако вы можете получить сетевую статистику для каждого сетевого интерфейса.
В общем случае en0
- это ваш Wi-Fi
интерфейс, а pdp_ip0
- ваш WWAN
интерфейс.
НетХороший способ получить информацию Wi-Fi / сотовой сети данных, так как конкретная дата-время!
Статистика данных (ifa_data->ifi_obytes
и ifa_data->ifi_ibytes
) сохраняется после предыдущей перезагрузки устройства.
Я не знаю почему, но ifi_opackets
и ifi_ipackets
показаны только для lo0
(я думаю, его основной интерфейс).
Да.Затем устройство подключается через WiFi
и не использует Интернет. if_iobytes
значения по-прежнему поступают, поскольку этот метод обеспечивает обмен байтами в сети, а не только через Интернет.
#include <net/if.h>
#include <ifaddrs.h>
static NSString *const DataCounterKeyWWANSent = @"WWANSent";
static NSString *const DataCounterKeyWWANReceived = @"WWANReceived";
static NSString *const DataCounterKeyWiFiSent = @"WiFiSent";
static NSString *const DataCounterKeyWiFiReceived = @"WiFiReceived";
NSDictionary *DataCounters()
{
struct ifaddrs *addrs;
const struct ifaddrs *cursor;
u_int32_t WiFiSent = 0;
u_int32_t WiFiReceived = 0;
u_int32_t WWANSent = 0;
u_int32_t WWANReceived = 0;
if (getifaddrs(&addrs) == 0)
{
cursor = addrs;
while (cursor != NULL)
{
if (cursor->ifa_addr->sa_family == AF_LINK)
{
#ifdef DEBUG
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
NSLog(@"Interface name %s: sent %tu received %tu",cursor->ifa_name,ifa_data->ifi_obytes,ifa_data->ifi_ibytes);
}
#endif
// name of interfaces:
// en0 is WiFi
// pdp_ip0 is WWAN
NSString *name = @(cursor->ifa_name);
if ([name hasPrefix:@"en"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WiFiSent += ifa_data->ifi_obytes;
WiFiReceived += ifa_data->ifi_ibytes;
}
}
if ([name hasPrefix:@"pdp_ip"])
{
const struct if_data *ifa_data = (struct if_data *)cursor->ifa_data;
if (ifa_data != NULL)
{
WWANSent += ifa_data->ifi_obytes;
WWANReceived += ifa_data->ifi_ibytes;
}
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return @{DataCounterKeyWiFiSent : @(WiFiSent),
DataCounterKeyWiFiReceived : @(WiFiReceived),
DataCounterKeyWWANSent : @(WWANSent),
DataCounterKeyWWANReceived : @(WWANReceived)};
}
Улучшена поддержка копирования / вставки!