高考完了,闲着没事, 想写一个 c/s ,但是在 协议域 装入有了一些问题。
struct sockaddr_in servaddr;
servaddr.sin_port = 6789;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); //local host ip
servaddr.sin_family = AF_INET;
本来很正常的代码,由于我强烈的好奇心,想看下 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)];
};
书上直接把 servaddr.sin_family 赋值了, 可是结构体里没有呀, 但编译没错呀,于是开始了我的鼓捣...
书上说的和代码有很多不一样的地方, 看来不能全信书本,还是得自己研究!
__SOCKADDR_COMMON (sin_);
__SOCKADDR_COMMON 是一个宏变量
#define __SOCKADDR_COMMON(sa_prefix) \
sa_family_t sa_prefix##family
这里面 \ 的意思应该是用前面替换整个声明变量的语句
sa_family_t 是 typedef unsigned short int sa_family_t;
## 是起一个连接字符串生成变量名的作用, 用##前的是一个变量, 这个变量名是 sa_prefix, 而sa_prefix 宏替换成了 sin_ ,所以这宏定义的最终形式是 unsigned short int sin_family
到这,我才放心的把
servaddr.sin_family = AF_INET;
宏定义很强大,赞一个!