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

猜你喜欢

转载自www.cnblogs.com/MR-ShiFang-1995/p/12546136.html