我正在遵循一段代码,其中使用预定义结构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的一个库文件中。
我不明白这个定义。一件一件的解释会很好。
如果他通过参数定义套接字的协议,为什么他必须设置套接字地址的族?
答案 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
,这记录了您可以使用的成员变量,无论实际实现如何。