我正在关注一段代码,其中使用预定义结构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)手册页中,它记录了可供您使用的成员变量,而不管实际实现看起来如何。