このトピックを検索しましたが、役立つ詳細情報はほとんど見つかりませんでした。これらの詳細情報を使用して、次のようなコードをいくつか作成してみました。
注: 件名だけでなく、この投稿で共有されている詳細を他の投稿と比較してから、これを重複としてマークしてください。
- (NSArray *)getDataCountersForType:(int)type {
BOOL success;
struct ifaddrs *addrs = nil;
const struct ifaddrs *cursor = nil;
const struct sockaddr_dl *dlAddr = nil;
const struct if_data *networkStatisc = nil;
int dataSent = 0;
int dataReceived = 0;
success = getifaddrs(&addrs) == 0;
if (success) {
cursor = addrs;
while (cursor != NULL) {
if (cursor->ifa_addr->sa_family == AF_LINK) {
dlAddr = (const struct sockaddr_dl *) cursor->ifa_addr;
networkStatisc = (const struct if_data *) cursor->ifa_data;
if (type == WiFi) {
dataSent += networkStatisc->ifi_opackets;
dataReceived += networkStatisc->ifi_ipackets;
}
else if (type == WWAN) {
dataSent += networkStatisc->ifi_obytes;
dataReceived += networkStatisc->ifi_ibytes;
}
}
cursor = cursor->ifa_next;
}
freeifaddrs(addrs);
}
return [NSArray arrayWithObjects:[NSNumber numberWithInt:dataSent], [NSNumber numberWithInt:dataReceived], nil];
}
このコードは、iPhone デバイスのインターネット使用状況に関する情報を収集します (私のアプリケーションだけではありません)。
現在、WiFi または 3G 経由でインターネットを使用すると、データ (バイト) はifi_obytes
(送信) と(受信) でのみ取得されますが、WiFi の使用量はとifi_ibytes
で取得する必要があると思います。ifi_opackets
ifi_ipackets
ifi_obytes
また、WiFi ネットワークに接続していても、インターネットを使用していない場合でも、とに付加価値が与えられることも付け加えておきますifi_ibytes
。
実装または理解が間違っている可能性があります。誰か助けてください。
編集: の代わりに(の代わりに)AF_LINK
を試しました。これにより、アプリケーションがクラッシュします。AF_INET
sockaddr_in
sockaddr_dl
ベストアンサー1
それはpdp_ip0
インターフェースの 1 つであり、すべてがボイスメール、一般的なネットワーク インターフェースなど、さまざまな機能専用のインターフェースpdpXXX
です。WWAN
Apple フォーラムで読んだところによると、OS はプロセスごとにネットワーク統計を保持しません。そのため、この問題に対する正確な解決策はありません。ただし、ネットワーク インターフェイスごとにネットワーク統計を取得することはできます。
一般的にはインターフェース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)};
}
コピー/貼り付けのサポートが改善されました。