Современный код должен использовать не struct in_addr
напрямую, а sockaddr_in
.Еще лучше было бы никогда вообще не создавать и не обращаться к каким-либо структурам sockaddr
, а делать все через библиотечные вызовы getaddrinfo
и getnameinfo
.Например, чтобы найти имя хоста или IP-адрес текстовой формы:
struct addrinfo *ai;
if (getaddrinfo("8.8.8.8", 0, 0, &ai)) < 0) goto error;
И получить имя (или IP-адрес текстовой формы, если он не разрешается в обратном направлении) адреса:
if (getnameinfo(ai.ai_addr, ai.ai_addrlen, buf, sizeof buf, 0, 0, 0) < 0) goto error;
Единственный раз, когда я могу подумать, когда вам могут понадобиться какие-либо структуры типа sockaddr
, - это использование getpeername
или getsockname
в сокете или recvfrom
.Здесь вы должны использовать sockaddr_storage
, если вы не знаете семейство адресов априори.
Я даю этот совет по 3 причинам:
- Намного проще выполнить все ваши строки-адреса с обратным адресом и обратно с помощью этих двух функций, чем запись всех случаев (для обработки сбоев поиска и попытки анализа адреса как ip и т. д.) по отдельности.
- Кодирование таким способом упрощает поддержкуПротоколы IPv6 (и, возможно, другие, отличные от IPv4).
- Старые функции
gethostbyname
и gethostbyaddr
были фактически удалены из последней версии POSIX, потому что они считались настолько устаревшими / устаревшими / сломанными.