码迷,mamicode.com
首页 > 其他好文 > 详细

struct sockaddr和struct sockaddr_in

时间:2020-03-22 16:17:14      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:net   存在   blog   通信   family   ddr   内存地址   tle   ext   

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

标签:net   存在   blog   通信   family   ddr   内存地址   tle   ext   

原文地址:https://www.cnblogs.com/MR-ShiFang-1995/p/12546136.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!