struct sockaddr和struct sockaddr_in
Posted mr-shifang-1995
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了struct sockaddr和struct sockaddr_in相关的知识,希望对你有一定的参考价值。
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
以上是关于struct sockaddr和struct sockaddr_in的主要内容,如果未能解决你的问题,请参考以下文章
结构体struct sockaddr_in, struct sockaddr,struct in_addr
这是将 struct sockaddr_in.sin_zero[8] 初始化为 0 的正确方法吗?
c/c++结构体struct的使用,只有一个成员为啥要定义成结构体