c-__SOCKADDR_COMMON(sin_)是什么意思



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

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

我找到

#定义__SOCKADDR_COMMON(sa前缀)\
sa_family_t sa_prefix##家族

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

我不理解这个定义。一个一个的解释会很好。

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

在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;

此外,struct sockaddr_in记录在ip(7)手册页中,它记录了可供您使用的成员变量,而不管实际实现看起来如何。

相关内容

  • 没有找到相关文章

最新更新