sockaddr和sockaddr_in
1. struct sockaddr和struct sockaddr_in:
用来处理网络通信的地址.
2. sockaddr:
#include <sys/socket.h> struct sockaddr { sa_family_t sin_family;//地址族 char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息 };
sockaddr存在缺陷:
sa_data把目标地址和端口信息混在一起了。而通常我们需要明确的ip地址与端口。
这就显得此结构体无用处。
但其作为bind()函数的一个形参,不能被舍弃。
3. sockaddr_in:
#include<netinet/in.h>#include <arpa/inet.h> struct sockaddr_in { sa_family_t sin_family;//地址族协议 uint16_t sin_port;//16位端口号---网络字节序 struct in_addr sin_addr;//32位IP地址---网络字节序 char sin_zero[8];//不使用 }
该结构体解决了sockaddr的缺陷,把port和addr 分开储存在两个变量中:sin_port和sin_addr
另外,sin_addr作为一个结构体,其内部含有s_addr这个结构体成员。用来存放32位IP地址---网络字节序
4. 关联
对于两个结构体来说: 其所占内存地址空间大小一样,都是16字节。因此,进行强制转换是没有残缺方的。 二者是并列结构,即对应内存的内容是一致的。因此指向sockaddr_in结构的指针也可以指向sockaddr。 故常用sockaddr_in进行信息填充,再用(struct sockaddr *)&addr进行强制转换成sockaddr