2015-01-07 2 views
3

Я модернизирую устаревшее приложение, которое хранит IPv4-адреса в массиве фиксированного размера беззнаковых длин. Адреса хранятся в порядке байтов хоста. То есть, это ntohl() 'd при выходе из API сокета и htonl()' d при переходе в API сокета.Каков наилучший способ хранения набора адресов IPv6?

Теперь, чтобы поддерживать IPv6, мне интересно, что делать с этим массивом. Должен ли я хранить строковое представление и сделать его массивом char[INET6_ADDRSTRLEN] или даже std::vector<std::string> или std::set<std::string> для поддержки большего количества адресов.

Или я мог бы хранить структуры in6_addr, что, вероятно, более эффективно для работы с чем std::string, но тогда мне интересно, как здесь применяется порядок байтов в сети и хоста?

+2

Посетите: http://stackoverflow.com/questions/26531531/efficient-way-to-store-ipv4-ipv6-addresses –

+2

'in6_addr' должен быть определенно лучшим выбором по сравнению с' std :: string'. «Как применяется порядок байтов в сети и хоста?», вы не сможете больше использовать простые «длинные» значения для хранения адресов IPv6. –

+0

, так что просто используйте struct in6_addr и не пытайтесь преобразовать его в 128-битное целое число. Кажется, справедливо. – Philipp

ответ

0

in6_addr требует, чтобы адрес находился в сетевом порядке. in6_addr внутренне хранит адрес ipv6 как объединение 16 символов, 8 шорт, 4 ints.

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