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