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 的正确方法吗?

vc2010的项目迁移到vc2019,解决编译错误问题

c/c++结构体struct的使用,只有一个成员为啥要定义成结构体

为啥我们在调用 bind() 时将 sockaddr_in 转换为 sockaddr?

指向结构的节点 ffi 指针