struct sockaddr_in { __SOCKADDR_COMMON (sin_); in_port_t sin_port; //端口号 struct in_addr sin_addr; //IP地址 unsigned char sin_zero[sizeof (struct sockaddr) - __SOCKADDR_COMMON_SIZE - sizeof (in_port_t) - sizeof (struct in_addr)]; //使与sockaddr长度一致 }; 上面这个结构体是Linux in.h头文件中定义的,那么开头的__SOCKADDR_COMMON (sin_);
2 回答
繁花不似锦
TA贡献1851条经验 获得超4个赞
__SOCKADDR_COMMON
();是宏定义的意思,括号里面是它的参数,这个宏定义表示的是tcp/ip协议的版本是,ipv4还是ipv6的意思,最后的那个unsigned
char
sin_zero的大小为什么做减法呢,是为了保证这个结构提到大小和另一个套接字地址的结构体struct
sockaddr的大小一致。这么说不知道你能不能不能理解,第一个参数在实际使的时候一般是个常数。
再看看别人怎么说的。
紫衣仙女
TA贡献1839条经验 获得超15个赞
其定义如下:
typedef
unsigned
short
int
sa_family_t;
#define
__SOCKADDR_COMMON(sa_prefix)
\
sa_family_t
sa_prefix##family
可以看到这就是一个整形变量(2字节),主要的用处是指明地址类型:取值主要是AF_UNIX|AF_INET|AF_INET6|AF_PACKET等等。
由于所有的地址结构体必然有地址类型,因此封装成一个统一的宏。
- 2 回答
- 0 关注
- 98 浏览
添加回答
举报
0/150
提交
取消