проблема inet_ntoa - PullRequest
       14

проблема inet_ntoa

1 голос
/ 25 марта 2010

Я объявляю следующие переменные

unsigned long   dstAddr;
unsigned long   gateWay;
unsigned long   mask;

Эти переменные содержат ipaddresses в сетевом порядке байтов. Поэтому, когда я пытаюсь напечатать точечную запись, используя функцию inet_ntoa для переменной маски, иногда она выводит странные значения. Приведенный ниже код находится в цикле while, который повторяется n раз.

printf("%s\t%s\t%s\t",inet_ntoa(dstAddr),inet_ntoa(gateWay),inet_ntoa(mask));

  192.168.122.0         0.0.0.0    0.255.255.255    

но это должно быть

  192.168.122.0         0.0.0.0    255.255.255.0

Я напечатал значения HEX переменных, и это показывает ..

007aa8c0    00000000      ffffff00  

Так это из-за inet_ntoa ??

На самом деле я пытаюсь получить значения объявленных переменных из таблицы маршрутизации 254 в ядре через NETLINKS. Я думаю, мне все равно следует использовать функцию inet_ntoa для преобразования значения в точечную нотацию. ??

Ответы [ 3 ]

5 голосов
/ 25 марта 2010

Единственное, что имеет смысл, это то, что ваше предположение относительно всех адресов, находящихся в сетевом порядке байтов, неверно.

3 голосов
/ 25 марта 2010

Ну, учитывая, что он работает для ваших немасковых значений (включая первое, в котором также установлен старший бит), я бы посмотрел, что на самом деле содержит mask.

Что это, когда вы распечатываете его как обычный беззнаковый длинный? Моя ставка в том, что mask на самом деле не правильное значение:

printf ("%08x\t%08x\t%08x\n", dstAddr, gateWay, mask);

(при условии, что у вас есть четыре байта long).

Например, эта маленькая программа (скомпилированная под Cygwin):

#include <stdio.h>

int main (void) {
    unsigned long dstAddr, gateWay, mask;
    dstAddr = 0x007aa8c0;
    gateWay = 0x00000000;
    mask    = 0x00ffffff;

    printf("%-15s %-15s %-15s\n",
        inet_ntoa (dstAddr),
        inet_ntoa (gateWay),
        inet_ntoa (mask));

    printf("%-15s ",  inet_ntoa (dstAddr));
    printf("%-15s ",  inet_ntoa (gateWay));
    printf("%-15s\n", inet_ntoa (mask));

    printf ("%08x%8s%08x%8s%08x\n",
        dstAddr, "",
        gateWay, "",
        mask);

    return 0;
}

выходы:

192.168.122.0   192.168.122.0   192.168.122.0
192.168.122.0   0.0.0.0         255.255.255.0
007aa8c0        00000000        00ffffff

Обратите внимание, что я должен был разделить свои вызовы на inet_ntoa, поскольку он использует статический буфер. Когда я делал все это за один printf, он перезаписывал содержимое этого буфера до того, как какой-либо из них был напечатан, поэтому я обработал только последний. Я не думаю , что происходит в вашем случае, так как вы получаете разные значения.

0 голосов
/ 14 декабря 2016

У меня тоже с вами такая же проблема. Используйте inet_ntop () и inet_pton (), если вам нужно наоборот. Не используйте inet_ntoa (), inet_aton () и тому подобное, поскольку они устарели и не поддерживают ipv6. см. ссылку: преобразовать IP-адрес int в строку

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