IPv4套接字地址结构
include <netinet/in.h>
struct in_addr {
in_addr_t s_addr;//至少32bit无符号地址
};
struct sockaddr_in {
uint8_t sin_len;
sa_family_t sin_family;//可以是任何无符号整数类型,通常是8bit
in_port_t sin_port;//至少16bit无符号端口
struct in_addr sin_addr;
char sin_zero[8];//这个字段不强制有,并且没有在使用
}
-
IPv4和TCP/UDP端口号在套接字地址结构中总是以网络字节序来保存,如果想要打印出来,注意主机字节序和网络字节序间的转换。
-
sin_zero字段未曾使用,按照惯例,我们在使用套接字地址前会使用bzero将所有字段置零,不用单独将sin_zero字段置0。
IPv6套接字地址结构
#include <netinet/in.h>
struct in6_addr {
uint8_t s6_addr[16];
};
#define SIN6_LEN
struct sockaddr_in6 {
uint8_t sin6_len;
sa_family_t sin6_family;//AF_INET6
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
通用套接字结构
任何套接字函数中的地址参数总是以引用的形式传递,在void *出现之前,使用通用套接字结构体,实现将不同的地址结构作为参数传入统一的套接字函数。这也是通用套接字的唯一作用。
#include <sys/socket.h>
struct sockaddr {
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
新的通用套接字
新的通用套接字较struct sockaddr做了如下优化:
- 满足对齐要求
- 足够大,能支持任何套接字地址结构
#include <netinet/in.h>
struct sockaddr_storage {
uint8_t ss_len;
sa_family_t ss_family;
}