Это архив сайта coldflame.by.ru, он не обновлялся с 2007 года. Мой современный сайт тут: http://leonid.shevtsov.me.
Домой! Обо мне Специально для РИ-06-1 Разнообразное... барахло, короче :) Программы и прочее Статьи и переводы Блог SmartDaemon
Предыдущая ОглавлениеСледующая

inet_ntoa(), inet_aton()

Преобразовать IP-адрес из записи с точками в struct in_addr и назад

Прототипы

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

char *inet_ntoa(struct in_addr in);
int inet_aton(const char *cp, struct in_addr *inp);
in_addr_t inet_addr(const char *cp);

Описание

Функции преобразовывают из struct in_addr (которая наверняка принадлежит твоей struct sockaddr_in) в запись с точками ("192.168.5.10") и наоборот. Например, если пользователь ввел IP-адрес с клавиатуры, это самый простой способ преобразовать его в struct in_addr, например, для дальнейшего вызова connect(). Если этих возможностей не хватает, попробуй функции DNS типа gethostbyname().

Функция inet_ntoa() преобразовывает struct in_addr в строку в формате с точками. "n" в "ntoa" значит "network", а "a" значит "ASCII" по историческим причинам (так что это значит "Network To ASCII" - суффикс "toa" применяется в стандартных функциях преобразования C, вроде itoa(), которая преобразовывает число в строку)

Функция inet_aton() обратная, и преобразовывает строку с адресом в in_addr_t (а это тип поля s_addr в структуре in_addr.)

Функция inet_addr() - более старый вариант inet_aton(). Она (теоретически) устарела, но все равно часто используется и это не является уголовным преступлением.

Возвращаемое значение

inet_aton() возвращает не ноль, если адрес можно преобразовать, и ноль, если адрес неправильно записан.

inet_ntoa() возвращает строку в записи с точками. Она хранится в статическом буфере и перезаписывается при каждом вызове функции.

inet_addr() возвращает адрес in_addr_t, или -1 при ошибке. Причем тот же самый результат можно получить, преобразовав строку "255.255.255.255", правильный IP-адрес. То есть, отстутствует правильная индикация ошибки. Поэтому лучше использовать inet_aton().)

Пример

struct sockaddr_in antelope;
char *some_addr;

inet_aton("10.0.0.1", &antelope.sin_addr); // записать IP в antelope

some_addr = inet_ntoa(antelope.sin_addr); // вернуть IP
printf("%s\n", some_addr); // выведет "10.0.0.1"

// а вот вызов, аналогичный вызову inet_aton():
antelope.sin_addr.s_addr = inet_addr("10.0.0.1");

См. также

gethostbyname(), gethostbyaddr()


Предыдущая ОглавлениеСледующая