大多数套接字函数都需要一个指向套接字地址结构的指针作为参数。每个协议族都定义它自己的套接字地址结构。均以sockaddr_开头,并以对应每个协议族的唯一后缀结尾。
IPv4套接字地址结构
网际套接字地址结构:
struct in_addr
{
in_addr_t s_addr;
}
struct sockaddr_in
{
uint8_t sin_len;
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
通用套接字地址结构
struct sockaddr
{
uint8_t sa_len;
sa_family_t sa_family;
char sa_data[14];
};
当作为一个参数传递进任何套接字函数时,套接字地址结构总是以引用的形式(也就是以指向该结构的指针)来传递。这些套接字函数必须处理来自所有支持的任何协议族的套接字地址结构。
于是套接字函数被定义为以指向某个通用套接字地址结构的一个指针作为其参数之一,如bind():
int bind(int, struct sockaddr *,socklen_t);
这就要求将指向特定与协议的套接字地址结构的指针进行类型强制转换(casting),变成指向某个通用套接字地址结构的指针。如:
struct sockaddr_in serv;
bind(sockfd, (struct sockaddr *) &serv, sizeof(serv));