sockaddr_in与sockaddr区别

来源:互联网 发布:python 判断进程存在 编辑:程序博客网 时间:2024/05/21 22:58

使用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类型就可以了。




原创粉丝点击