inet_ntoa: переписывает значения в printf

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

inet_ntoa: переписывает значения в printf

Сообщение IMB »

Доброго дня!
Проблемный код:

Код: Выделить всё

struct in_addr ip, mask, gate, dns;
if (0 == strcmp(data, "net")) {
        ip.s_addr = net_get_ifaddr("eth0");
        mask.s_addr = net_get_netmask("eth0");
        gate.s_addr = net_get_gateway();
        dns.s_addr = net_get_dns();
        printf("Content-Type: text/plain\n\n"
               "{\"result\": \"OK\","
               "\"ip\": \"%s\", \"mask\": \"%s\"}",
               inet_ntoa(ip), inet_ntoa(mask));

При данном коде в результате везде результат последнего вызова inet_ntoa.
Работающий код:

Код: Выделить всё

struct in_addr ip, mask, gate, dns;
if (0 == strcmp(data, "net")) {
        char str_ip[20];
        char str_mask[20];
        ip.s_addr = net_get_ifaddr("eth0");
        mask.s_addr = net_get_netmask("eth0");
        gate.s_addr = net_get_gateway();
        dns.s_addr = net_get_dns();
        strncpy(str_mask,inet_ntoa(mask),20);
        strncpy(str_ip,inet_ntoa(ip),20);
        printf("Content-Type: text/plain\n\n"
               "{\"result\": \"OK\","
               "\"ip\": \"%s\", \"mask\": \"%s\"}",
               str_ip, str_mask);

Работающий код с последовательными вызовами inet_ntoa:

Код: Выделить всё

SysInfo *pSysInfo;
if (0 == strcmp(data, "net")) {
        printf("Content-Type: text/plain\n\n"
                "{\"result\": \"OK\","
                "\"mac\": \"%02x:%02x:%02x:%02x:%02x:%02x\", "
                "\"ip\": \"%s\", \"mask\": \"%s\", "
                "\"gate\": \"%s\", \"dns\": \"%s\"}",
                "\"dhcp\": %d, \"dhcp_config\": %d}",
                pSysInfo->lan_config.net.MAC[0],
                pSysInfo->lan_config.net.MAC[1],
                pSysInfo->lan_config.net.MAC[2],
                pSysInfo->lan_config.net.MAC[3],
                pSysInfo->lan_config.net.MAC[4],
                pSysInfo->lan_config.net.MAC[5],
                inet_ntoa(pSysInfo->lan_config.net.ip),
                inet_ntoa(pSysInfo->lan_config.net.netmask),
                inet_ntoa(pSysInfo->lan_config.net.gateway),
                inet_ntoa(pSysInfo->lan_config.net.dns),
                pSysInfo->lan_config.net.dhcp_enable,
                pSysInfo->lan_config.net.dhcp_config);

Я не совсем понимаю, почему при вызове inet_ntoa с структурой не наблюдается переписывание предыдущих вызовов inet_ntoa.
Спасибо.
Спасибо сказали:
Аватара пользователя
verrens
Сообщения: 14
ОС: Sid

Re: inet_ntoa: переписывает значения в printf

Сообщение verrens »

Там статичный буфер используется.
(man inet_ntoa) писал(а):The inet_ntoa() function converts the Internet host address in, given in network byte order, to a string in IPv4
dotted-decimal notation. The string is returned in a statically allocated buffer, which subsequent calls will
overwrite.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: inet_ntoa: переписывает значения в printf

Сообщение IMB »

Это я прочитал, но почему при вызове inet_ntoa с членом структуры этот статичный буфер не переписывается?
Спасибо сказали: