Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

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

MiK13
Сообщения: 1219
ОС: Linux Debian

Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

Сообщение MiK13 »

Возникла необходимость передавать пакеты на "свой" компьютер. То есть на адрес 127.0.0.1
Увидел в usr/include/netinet/in.h константу

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

# define INADDR_LOOPBACK        ((in_addr_t) 0x7f000001) /* Inet 127.0.0.1.  */
и решил ей воспользоваться.
Объявил в программе

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

struct sockaddr_in server_s = {AF_INET, 0, {INADDR}, {0}};
стал проверять -- не работает.
tcpdump показал, что пакеты отправляются на 1.0.0.127, то есть в константе другой порядок байтов.
В принципе, если объявляю структуру внутри функции, можно использовать htonl(INADDR_LOOPBACK), а если вне?
Проблему решил с помощью

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

#define INADDR 0x0100007F
.
Но насколько это "правильно"?
.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5355
ОС: Gentoo

Re: Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

Сообщение /dev/random »

MiK13 писал:
11.03.2024 01:36
В принципе, если объявляю структуру внутри функции, можно использовать htonl(INADDR_LOOPBACK), а если вне?
Официально - только внутри функции.
Неофициально - можете включить #include <asm/byteorder.h> из linux-специфичного пакета linux-headers и использовать макрос __constant_htonl() вместо функции htonl(). Его можно использовать и за пределами функции.
Или же, если требуется работа в системах, отличных от linux, можете сами объявить аналогичный макрос.
Спасибо сказали:
MiK13
Сообщения: 1219
ОС: Linux Debian

Re: Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

Сообщение MiK13 »

/dev/random писал:
11.03.2024 02:38
Неофициально - можете включить #include <asm/byteorder.h> из linux-специфичного пакета linux-headers и использовать макрос __constant_htonl()
Файла asm/byteorder.h не нашёл. Но нашёл каталог /usr/include/linux/byteorder с двумя файлами: big_endian.h и little_endian.h
И нашёл в них этот макрос. В little_endian.h:

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

#define __constant_htonl(x) ((__be32)___constant_swab32((x)))
В big_endian.h это

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

#define __constant_htonl(x) ((__be32)(__u32)(x))
Но, по идее, компилятор, ведь, должен знать, какая система, big или little.
/dev/random писал:
11.03.2024 02:38
если требуется работа в системах, отличных от linux, можете сами объявить аналогичный макрос
Когда-то для занесения номера порта сделал макрос

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

#define SwaB(W) ((((W)&255)<<8)|(((W)>>8)&255))
Но для 4-байтовых как-то не хотелось верить, что нет чего-то "стандартного.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5355
ОС: Gentoo

Re: Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

Сообщение /dev/random »

MiK13 писал:
11.03.2024 04:01
Файла asm/byteorder.h не нашёл. Но нашёл каталог /usr/include/linux/byteorder с двумя файлами: big_endian.h и little_endian.h
Файл asm/byteorder.h как раз и включает либо big_endian.h, либо little_endian.h, в зависимости от вашей системы.
В Debian он в пакете linux-libc-dev, путь /usr/include/<архитектура>/asm/byteorder.h.
Спасибо сказали:
MiK13
Сообщения: 1219
ОС: Linux Debian

Re: Как можно использовать константу INADDR_LOOPBACK из файоа netinet/in.h?

Сообщение MiK13 »

/dev/random писал:
11.03.2024 08:38
Файл asm/byteorder.h как раз и включает либо big_endian.h, либо little_endian.h, в зависимости от вашей системы.
В Debian он в пакете linux-libc-dev, путь /usr/include/<архитектура>/asm/byteorder.h.
Спасибо. Нашёл в /usr/include/x86_64-linux-gnu/asm/
Спасибо сказали: