Могу ли я иметь структуру сетевых пакетов, не зависящую от семейства адресов? - PullRequest
1 голос
/ 11 августа 2010

Я добавляю поддержку IPv6 в сетевое приложение.Некоторые управляющие пакеты должны содержать смешанный список адресов IPv4 и IPv6 (текущий код поддерживает только IPv4):

struct control_packet {
    [...]
    ushort          ip1_afi;
    struct in_addr  ip1;
    ushort          ip2_afi;
    struct in_addr  ip2;
    uchar           reserved1;
    uchar           prefix_mask_len;
    ushort          prefix_afi;
    struct in_addr  prefix;
} __attribute__ ((__packed__));

Как заменить структуры in_addr в oder для поддержки как IPv4, так и IPv6, исключивЗначение AFI раньше?

Я не думаю, что могу использовать sockaddr_storage для этого, потому что оно резервирует больше места, чем необходимо для пакета.

Я видел людей, использующих uchar ip1[0], но тогда мне, вероятно, придется собирать пакет вручную, не используя структуру.Любые предложения?

Я также принимаю хорошие ссылки RTFM:)

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 августа 2010

Вы можете просто использовать union из struct in_addr и struct in6_addr вместо struct in_addr, который у вас есть сейчас.

0 голосов
/ 11 августа 2010

Мне кажется, что в основном структура sockaddr уже реализует что-то в той же цепочке мыслей; член sa_family сообщает, является ли это ip4 или ip6.

Я бы пошел на то, что склеивает ваши поля afi и in_addr в одну правильную абстракцию IP-адреса [46].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...