Хотя это хорошие ответы, они сломали мою компиляцию с -pedantic -std=c99 -Werror
.
Из человек 7 розетка
Чтобы разрешить передачу любого типа адреса сокета интерфейсам в API сокетов, определен тип struct sockaddr
. Цель
этот тип предназначен исключительно для разрешения приведения адреса сокета, специфичного для домена
типы к «универсальному» типу, чтобы избежать предупреждений компилятора о типе
несоответствия в вызовах API сокетов.
Чтобы получить все соответствующие данные на этой странице, из glibc-2.17 (RHEL7) я вижу
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
, где SOCKADDR_COMMON - uint16_t
. Таким образом, общий размер 16B.
IP (интернет-протокол) Домен от man 7 ip :
struct sockaddr_in {
sa_family_t sin_family; /* address family: AF_INET */
in_port_t sin_port; /* port in network byte order */
struct in_addr sin_addr; /* internet address */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
Первая попытка
inet_ntoa( ((struct sockaddr_in) peer_addr).sin_addr )
Задача
error: conversion to non-scalar type requested
Вторая попытка
inet_ntoa( ((struct sockaddr_in *) &peer_addr)->sin_addr ) ));
Проблема
error: dereferencing type-punned pointer might break strict-aliasing rules [-Werror=strict-aliasing]
Третья попытка: inet_pton, в любом случае более современная, поточно-безопасная, аннулирует *
char peer_addr_str[ INET_ADDRSTRLEN ];
inet_ntop( AF_INET, &peer_addr, peer_addr_str, INET_ADDRSTRLEN );
ок, работает. Читаемая человеком строка с десятичными точками находится в peer_addr_str
.