2014-09-25 2 views
0

Я проверяю потребление данных пользователями, используя метод, приведенный ниже, взятый из here. Он работает хорошо в большинстве случаев, но для некоторых пользователей он возвращает отрицательное значение. Другими словами, WWANReceived отрицательный.Использование отрицательного значения данных на iPhone?

Как это может быть? Есть ли исправление?

+ (NSArray *)getDataCounters { 

    BOOL success; 
    struct ifaddrs *addrs; 
    const struct ifaddrs *cursor; 
    const struct if_data *networkStatisc; 

    int WiFiSent = 0; 
    int WiFiReceived = 0; 
    int WWANSent = 0; 
    int WWANReceived = 0; 

    NSString *name = [[NSString alloc]init]; 

    // getifmaddrs 
    success = getifaddrs(&addrs) == 0; 
    if (success) 
    { 
     cursor = addrs; 
     while (cursor != NULL) 
    { 
     name = [NSString stringWithFormat:@"%s",cursor->ifa_name]; 
     // names of interfaces: en0 is WiFi ,pdp_ip0 is WWAN 

     if (cursor->ifa_addr->sa_family == AF_LINK) 
     { 
      if ([name hasPrefix:@"en"]) 
      { 
       networkStatisc = (const struct if_data *) cursor->ifa_data; 
       WiFiSent += networkStatisc->ifi_obytes; 
       WiFiReceived += networkStatisc->ifi_ibytes; 
      } 

      if ([name hasPrefix:@"pdp_ip"]) 
      { 
       networkStatisc = (const struct if_data *) cursor->ifa_data; 
       WWANSent += networkStatisc->ifi_obytes; 
       WWANReceived += networkStatisc->ifi_ibytes; 
      } 
     } 

     cursor = cursor->ifa_next; 
     } 

     freeifaddrs(addrs); 
    } 

    return [NSArray arrayWithObjects:[NSNumber numberWithInt:WiFiSent], [NSNumber numberWithInt:WiFiReceived],[NSNumber numberWithInt:WWANSent],[NSNumber numberWithInt:WWANReceived], nil]; 
} 

ответ

3

Возможно, вы уже решили это, я просто тестировал тот же пример и натолкнулся на это.

Вы должны изменить тип от int до длинного, чтобы обрабатывать большие значения. То, что вы видите, представляет собой целочисленное переполнение, которое происходит после 2 ГБ трафика.

+0

Спасибо @ jab11, я сделаю снимок. – Eddy

+0

Resurrecting это из кишечника переполнения стека ... Какие переменные вы должны были изменить от int до долгого времени, и это сработало? Вы должны принять ответ, если так! – Amos

+0

@Amos все четыре переменные int должны иметь длинный длинный тип. также возвращаемые NSNumbers, которые должны быть созданы с помощью номераWithLongLong: calls. – jab11

Смежные вопросы