套接字地址族与sockaddr结构

1 套接字地址族

地址族来自Address Family的翻译,可以看成是套接字的类型,即不同的套接字对应不同的地址族。每种类型的套接字都拥有自己独特的通信寻址方式。地址族的取值包括AF_INET、AF_INET6以及AF_UNSPEC等,这些值在Winsock2.h中定义。

2 sockaddr结构

sockaddr结构用于存储套接字地址。在Windows Vista之前的版本,sockaddr结构在Winsock2.h中定义,在Windows Vista以及之后的版本中,sockaddr结构在Ws2def.h中定义。其在Winsock2.h中定义的格式为

struct sockaddr {

ushort sa_family;

char sa_data[14]; };

其中,sa_family表示“1 套接字地址族”中提到的地址族;sa_data保存了用于套接字寻址所需要的信息。sa_family的值是AF_INET表示使用IPv4的寻址方式;AF_INET6表示使用IPv6的寻址方式;AF_UNSPEC表示寻址方式不确定,根据主机的服务确定任何合适的寻址方式。在“1 套接字地址族”中提到,不同的地址族对应不同的套接字寻址方式,其寻址所需的信息不同,即sa_data中保存的信息不同。所以,对于sa_family的不同取值,sockaddr结构有不同的格式。

2.1 AF_INET对应的格式

当sa_family的值是AF_INET时,表示使用IPv4的寻址方式,其sockaddr结构对应的格式为

struct sockaddr_in {

short sin_family;

u_short sin_port;

struct in_addr sin_addr;

char sin_zero[8];

};

其中,sin_family的值必须是AF_INET;sin_port表示端口号;sin_addr表示IP地址;sin_zero[8]是为了保证sockaddr_in的大小与sockaddr相同而进行的填零。也就是说,IPv4的套接字寻址信息包括端口号和IP地址。

2.2 AF_INET6对应的格式

当sa_family的值是AF_INET6时,表示使用IPv6的寻址方式,其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;

};

2.3 AF_IRDA对应的格式

当sa_family的值是AF_IRDA时,表示使用红外的寻址方式,其sockaddr结构对应的格式为

typedef struct _SOCKADDR_IRDA {

u_short irdaAddressFamily;

u_char irdaDeviceID[4];

char irdaServiceName[25];

} SOCKADDR_IRDA, *PSOCKADDR_IRDA, *LPSOCKADDR_IRDA;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值