Преобразовать 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()
|