Chociaż są to dobre odpowiedzi, że złamałem skompilować z -pedantic -std=c99 -Werror
.
Z Man7 gniazdo
umożliwienia wprowadzenia typ adresu gniazda mają być przekazane do interfejsu API w gniazdach, typ struct sockaddr
jest zdefiniowana. Celem tego typu jest umożliwienie odlewania specyficznych dla domeny adresów gniazd o nazwach typu "ogólnego", aby uniknąć ostrzeżeń kompilatora na temat niedopasowania wywołań do API gniazd w typie .
Aby uzyskać wszystkie istotne dane na tej stronie, z glibc-2,17 (RHEL7) widzę
/* Structure describing a generic socket address. */
struct sockaddr
{
__SOCKADDR_COMMON (sa_); /* Common data: address family and length. */
char sa_data[14]; /* Address data. */
};
gdzie SOCKADDR_COMMON jest uint16_t
. Łączny rozmiar to 16B.
IP (Internet Protocol) domeny specyficzne, z człowieka 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 */
};
Najpierw spróbuj
inet_ntoa(((struct sockaddr_in) peer_addr).sin_addr)
Problem
error: conversion to non-scalar type requested
drugie spróbować
inet_ntoa(((struct sockaddr_in *) &peer_addr)->sin_addr)));
Problem
error: dereferencing type-punned pointer might break strict-aliasing rules [-Werror=strict-aliasing]
Thrid try: inet_pton, bardziej nowoczesny anyways, wątek bezpieczny, bierze void *
char peer_addr_str[ INET_ADDRSTRLEN ];
inet_ntop(AF_INET, &peer_addr, peer_addr_str, INET_ADDRSTRLEN);
ok, działa. Odczytywalny ludzki ciąg znaków dziesiętnych i kropek jest w peer_addr_str
.
To jest dokładnie to, co musiałem zrobić, dziękuję. – adhanlon
Zauważ, że teraz 'inet_ntoa' jest uważane za przestarzałe. Zamiast tego powinieneś użyć 'inet_ntop', który obsługuje więcej formatów. –
Pamiętaj, że 'inet_ntoa' nie jest bezpieczne dla wątków –