__SOCKADDR_COMMON(sin_)是什么意思?

时间:2015-12-31 00:53:49

标签: c linux websocket network-programming

我正在遵循一段代码,其中使用预定义结构sockaddr_in的作者写host_addr.sin_family = AF_INET;正在尝试在Linux(Ubuntu)中设置一个迷你网络服务器。但是sin_family并没有出现在struct sockaddr_in的定义中。包含在定义中的__SOCKADDR_COMMON (sin_)是否具有特殊含义?

在网络服务器的源文件中,他包含<sys/socket.h>, <netinet/in.h>, <arpa/inet.h>和使用Linux库的预定义库。

我找到了

  

#define __SOCKADDR_COMMON(sa前缀)\
   sa_family_t sa_prefix ## family

在他使用的linux的一个库文件中。

我不明白这个定义。一件一件的解释会很好。

如果他通过参数定义套接字的协议,为什么他必须设置套接字地址的族?

1 个答案:

答案 0 :(得分:4)

在linux上,struct sockaddr_in看起来像这样;

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)];
  };

__ SOCKADDR_COMMON是一个普通的C宏,其定义如下:

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

它简单地与##预处理器操作连接传入的参数以形成变量名。

当您在struct sockaddr_in中扩展该用法时,您会得到:

sa_family_t sin_family

因此__SOCKADDR_COMMON (sin_);只会被sa_family_t sin_family;

取代

此外,ip(7)手册页中记录了struct sockaddr_in,这记录了您可以使用的成员变量,无论实际实现如何。