在/usr/include/linux/socket.h中定義
struct sockaddr {
sa_family_t sa_family; /* address family, AF_xxx */
char sa_data[14]; /* 14 bytes of protocol address */
};
在/usr/include/netinet/in.h中定義
struct sockaddr_in
{__SOCKADDR_COMMON (sin_);
in_port_t sin_port; /* Port number. */
struct in_addr sin_addr; /* Internet address. */
/* Pad to size of `struct sockaddr'. */
unsigned char sin_zero[sizeof (struct sockaddr) -
__SOCKADDR_COMMON_SIZE -
sizeof (in_port_t) -
sizeof (struct in_addr)];
/* 字符數組sin_zero[8]的存在是爲了保證結構體struct sockaddr_in的大小和結構體struct sockaddr的大小相等 */
};
struct sockaddr_in6 { short sin6_family; u_short sin6_port; u_long sin6_flowinfo; struct in6_addr sin6_addr; u_long sin6_scope_id; };
struct in6_addr {
union {
__u8 u6_addr8[16];
__be16
u6_addr16[8];
__be32
u6_addr32[4];
} in6_u;
struct in_addr {
unsigned long s_addr;
};
struct sockaddr_nl {
sa_family_t nl_family; /*AF_NETLINK*/
unsigned short nl_pad; /* 0 */
pid_t nl_pid; /* 進程pid */
u_32 nl_groups; /* 多播組掩碼*/
}nl;
struct nlmsghdr {
_u32 nlmsg_len; /* Length of msg including header */
_u32 nlmsg_type; /* 操作命令 */
_u16 nlmsg_flags; /* various flags */
_u32 nlmsg_seq; /* Sequence number */
_u32 nlmsg_pid; /* 進程PID */
};
struct rtmsg {
unsigned char rtm_family; /* 路由表地址族 */
unsigned char rtm_dst_len; /* 目的長度 */
unsigned char rtm_src_len; /* 源長度 */ (2.4.10頭文件的註釋標反了?)
unsigned char rtm_tos; /* TOS */
unsigned char rtm_table; /* 路由表選取 */
unsigned char rtm_protocol; /* 路由協議 */
unsigned char rtm_scope;
unsigned char rtm_type;
unsigned int rtm_flags;
};
struct addrinfo {
int ai_flags;
int ai_family;//AF_INET,AF_INET6或者AF_UNSPEC
int ai_socktype;//SOCK_STREAM or SOCK_DGRAM
int ai_protocol;//0
size_t ai_addrlen;//往下參數在hints中均爲0或NULL
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};