Si bien estas son buenas respuestas, me rompieron la compilación con -pedantic -std=c99 -Werror
.
De hombre 7 socket
para permitir que cualquier tipo de dirección de socket que se pasa a las interfaces de la API de sockets, se define el tipo struct sockaddr
. El propósito de este tipo es simplemente permitir la conversión de tipos de direcciones de sockets específicos del dominio a un tipo "genérico", para evitar advertencias del compilador sobre el tipo no coinciden en las llamadas a la API de sockets.
para obtener todos los datos relevantes en esta página, desde glibc-2.17 (RHEL7) Veo
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
donde SOCKADDR_COMMON es un uint16_t
. Entonces el tamaño total es 16B.
IP (protocolo de Internet) de dominio específico, desde el hombre 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 */
};
Pruebe primero
inet_ntoa(((struct sockaddr_in) peer_addr).sin_addr)
Problema
error: conversion to non-scalar type requested
segundo intento
inet_ntoa(((struct sockaddr_in *) &peer_addr)->sin_addr)));
Problema
error: dereferencing type-punned pointer might break strict-aliasing rules [-Werror=strict-aliasing]
Thrid intento: inet_pton, más moderno de todos modos, hilo de seguridad, toma void *
char peer_addr_str[ INET_ADDRSTRLEN ];
inet_ntop(AF_INET, &peer_addr, peer_addr_str, INET_ADDRSTRLEN);
bien, funciona. cadena decimal y puntos legible por el hombre está en peer_addr_str
.
eso es exactamente lo que tenía que hacer, gracias. – adhanlon
Tenga en cuenta que ahora 'inet_ntoa' se considera obsoleta. En su lugar, debe usar 'inet_ntop', que admite más formatos. –
Recuerde que 'inet_ntoa' no es seguro para subprocesos –