採取雖然這些都是很好的答案,他們打破了我的編譯-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(互聯網協議)特定領域的,從人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]
THRID嘗試:inet_pton,更現代反正,線程安全的,需要無效*
char peer_addr_str[ INET_ADDRSTRLEN ];
inet_ntop(AF_INET, &peer_addr, peer_addr_str, INET_ADDRSTRLEN);
確定,工作。人類可讀的十進制和點的字符串在peer_addr_str
。
來源
2015-05-12 15:01:29
FDS
這正是我需要做的,謝謝。 – adhanlon
請注意,現在'inet_ntoa'被視爲棄用。你應該改用支持更多格式的'inet_ntop'。 –
請記住'inet_ntoa'不是線程安全的 –