在之前的socket编程中, 我们认识了一些接口, 模拟实现udp和tcp通信的时候也经常用到sockaddr和sockaddr_in两种结构体, 非常容易混乱, 今天我们就来搞清楚他们的区别.
1. sockaddr
sockaddr在头文件<sys/socket.h>中定义
sockaddr是网络编程中通用的结构, 一般用于函数中将其他结构强转为sockaddr作为参数传递
struct sockaddr {
sa_family_t sin_family;//地址族
char sa_data[14]; //14字节,包含套接字中的目标地址和端口信息
};
2. sockaddr_in
sockaddr_in在头文件<netinet/in.h>中定义
sockaddr_in是IPv4使用的结构, 里面封装了地址信息, 端口号和ip地址
struct sockaddr_in {
sa_family_t sin_family; //地址族
uint16_t sin_port; //16位tcp/udp端口号
struct in_addr sin_addr; //32位IP地址
char sin_zero[8]; //不使用
};
struct in_addr {
In_addr_t s_addr; //32位ipv4地址
};
注意这个结构体的嵌套, ip地址是s_addr中的数据
我们进行网络编程的时候一般先构建ipv4地址结构, 也就是构建sockaddr_in结构体, 在调用接口时强转成sockaddr进行传参