2016-06-13 2 views
3

У меня есть два адреса ipv6, хранящихся в структуре struct in6_addr. Я хотел бы найти, какой из них меньше, без использования memcmp. Есть ли лучший способ сравнить адреса ipv6?Как сравнить адрес ipv6 в c без использования memcmp

struct in6_addr { 
     unsigned char s6_addr[16]; /* IPv6 address */ 
}; 
+0

Что такое определение типа 'STRUCT in6_addr'? – user694733

+0

Почему бы не перебрать поле 's6_addr', чтобы сравнить его по одному с меньшим, чем оператор? – Garf365

+1

И почему вы не можете использовать 'memcmp' на 2 членах' s6_addr'? Похоже, самый простой способ сравнить. – user694733

ответ

1

В общих точках зрения: написать то, что вы хотите сделать, не используйте функцию или уловки, чтобы достичь того, чего вы хотите! Здесь, если вы хотите сравнить ip v6, сначала определите, как его сравнить, и реализуйте, как вы определили.

Поэтому, если вы хотите сравнить логические данные, не используйте memcmp. Используйте его только тогда, когда вы хотите сравнить непосредственно необработанную память.

Например, если вы решили, что вы должны сравнить каждый элемент ipv6 и первых различных элементов говорит соотношение между двумя ipv6, писать:

// Not checked code, just an example 
// Return 0 if ipA == ipB, -1 if ipA < ipB and 1 if ipA > ipB 
int compare_ipv6(struct in6_addr *ipA, struct in6_addr *ipB) 
{ 
    int i = 0; 
    for(i = 0; i < 16; ++i) // Don't use magic number, here just for example 
    { 
     if (ipA->s6_addr[i] < ipB->s6_addr[i]) 
      return -1; 
     else if (ipA->s6_addr[i] > ipB->s6_addr[i]) 
      return 1; 
    } 
    return 0; 
} 
+0

1) Краткий 2) -> для указателей. 3) если true или false - результат, верните не 'int', а' bool'. 'bool compare_ipv6 (struct in6_addr * ipA, struct in6_addr * ipB, int len) { {0 = s6_addr [i]) return false; return true; } ' –

+0

@John_West сделано. Большое спасибо за ваши комментарии – Garf365

+0

О третьем пункте: Извините, согласитесь с вами! И о первом пункте: вы можете избавиться от переменной 'result' и' (result == 0) 'condition, используя' return'. Более того, вы не выполняете правильное сравнение сейчас: вы должны немедленно «вернуть» на '<' or '>' –

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