sockaddr_in与sockaddr区别

本文详细解析了sockaddr和sockaddr_in两种数据结构之间的差异,并解释了它们在socket编程中的作用。sockaddr_in结构提供了更易于理解的IP和端口处理方式,通过填充字段与sockaddr保持大小一致,便于在编程中使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用socket编程以来一直没弄清楚这两个数据结构有什么区别,今天突然想弄清楚这两个数据结构到底有什么差别,找了LINUX下的几个头文件,终于弄清楚了,看来某位大神说的不错,源码面前无密码可言。直接上代码,这里把相关的定义全部集中到一起,方便理解:

typedef unsigned short int sa_family_t; 

#define __SOCKADDR_COMMON(sa_prefix) \ 
   sa_family_t sa_prefix##family

#define __SOCKADDR_COMMON_SIZE  (sizeof (unsigned short int)) 

struct sockaddr_in                                                                                                    
  {
    __SOCKADDR_COMMON (sin_);
    in_port_t sin_port;                 /* Port number.  */                                                           
    struct in_addr sin_addr;            /* Internet address.  */                                                      

    /* Pad to size of `struct sockaddr'.  */
    unsigned char sin_zero[sizeof (struct sockaddr) -                                                                 
                           __SOCKADDR_COMMON_SIZE -                                                                   
                           sizeof (in_port_t) -                                                                       
                           sizeof (struct in_addr)];                                                                  
  };

typedef uint32_t in_addr_t;
struct in_addr
  {
    in_addr_t s_addr;
  };

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];           /* Address data.  */
  };

从代码中可以清楚看到,这两个结构大小都是16个字节。sockaddr_in这个结构是编程人员更容易理解的方式,将ip, port单独作为一个字段来处理,将且有一个填充字段使两个结构大小一致,可以相互转换。建议编程过程中不要使用sockaddr这个结构,让操作系统来使用。编程人员可以直接使用sockaddr_in这个结构,然后强转成sockaddr类型就可以了。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值