1. IPv4套接字地址结构
IPv4套接字地址以sockaddr_in
命名,定义在<netinet/in.h>
头文件中。
地址结构
struct in_addr { in_addr_t s_addr; // 32位网络字节序IPv4地址 } struct sockaddr_in { uint8_t sin_len; // 套接字的地址结构的长度 sa_family_t sin_family; // 网络协议族,IPv4为AF_INET in_port_t sin_port; // 端口号(网络字节序) struct in_addr sin_addr; // IPv4地址 char sin_zero[8]; // 未使用的额外字节 }
2. 通用套接字地址结构
对于大多数套接字函数(比如: bind, connect, sendto等等)的参数通常是套接字地址结构的引用(也就是以指向该结构的指针),但是,为让这些函数能够处理来自于任何协议族的套接字地址结构。我们为此专门在<sys/socket.h>
头文件定义了一个通用套接字地址结构。
struct sockaddr { uint8_t sa_len; sa_family_t sa_family; // 地址协议族: AF_xxx value char sa_data[14]; // 特殊的协议地址 }
实例
int bind(int, struct sockaddr *, socklen_t);
在调用时都必须要将特定协议的套接字结构地址的指针进行强制类型转换为指向通用套接字地址结构的指针;
struct sockaddr_in serv; //IPv4地址 bind(sockfd, (struct sockaddr *) & serv, sizeof(serv));