struct sockaddr定义及延伸

跟踪看一下 strcut sockaddr 是怎么定义的,这个定义在 /usr/include/bits/socket.h里
引用

struct sockaddr
  {
      __SOCKADDR_COMMON ( sa_);     
      char sa_data [ 14 ];                   
  };

由上可见,sockaddr 结构体的第一个成员是一个宏定义,再来看一下这个宏定义(在/usr/include/bits/sockaddr.h 里):
引用


#define __SOCKADDR_COMMON(sa_prefix)sa_family_t sa_prefix##family

由注释可知,利用这个宏,我们根据需要,在 sockaddr 里可以填入不同的地址类型规范,如 struct sockaddr,struct sockaddr_in,struct sockaddr_un 等。

同样在    /usr/include/bits/sockaddr.h里看到上面的 sa_family_t 的原型是:
引用

typedef unsigned short int sa_family_t;

由此可见,是个无符号短整型。

例如,我们用的是 UNIX 域套接字,那么可以在 /usr/include/sys/un.h 中观察到 sockaddr_un的定义:
引用

struct sockaddr_un
  {
      __SOCKADDR_COMMON ( sun_);
      char sun_path [ 108 ];               
  };

那么,根据上面的 __SOCKADDR_COMMON 的定义,可知结构体中的第一个成员为:

sun_family                           

所以,这个结构题可改写为:
struct sockaddr_un
  {
      sa_family_t sun_family ;
      char sun_path [ 108 ];               
  };[/quote]
由于 sa_family 是无符号整型,而在 /usr/include/bits/socket.h 里定义的协议类型 (PF_XXX(实际上被重定义为 AF_XXX) 便可以赋给 sun_family,如 selfdefine_address.sun_family= AF_UNIX (表示使用 UNIX 域套接字)。

你可能感兴趣的:(struct sockaddr定义及延伸)