今天在看UNPV1,4.4节的时候,当看到bind函数在绑定IP地址与端口号时UNP上说:
对于IPV4来说,通配地址由常值INADDR_ANY来指定,其值一般为0;他告知内核去选择IP地址。我们在图1-9中随如下赋值语句看到过它的使用:
structsockaddr_in servaddr;
servaddr.sin_addr.s_addr= htonl (INADDR_ANY); /* wildcard */
这对于IPV4而言是可行的,因为其IP地址是一个32位的值,可以用一个简单的数字常数表示,,对于IPV6就不可以这么做了,因为128位的IPV6地址存放在一个结构体中而这个成员又是一个字符数组,我们无法对其直接赋值。
Figure 3.1 The Internet (IPv4)socket address structure: sockaddr_in.
struct in_addr {
in_addr_t s_addr; /* 32-bit IPv4 address */
/* network byteordered */
};
struct sockaddr_in {
uint8_t sin_len; /* length of structure (16) */
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 16-bit TCP or UDP port number */
/* network byteordered */
structin_addr sin_addr; /* 32-bit IPv4 address */
/* network byteordered */
char sin_zero[8]; /* unused */
};
Figure 3.4 IPv6 socket addressstructure: sockaddr_in6.
struct in6_addr {
uint8_t s6_addr[16]; /* 128-bit IPv6 address */
/* networkbyte ordered */
};
#define SIN6_LEN /* required for compile-time tests */
struct sockaddr_in6 {
uint8_t sin6_len; /* length of this struct (28) */
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* transport layer port# */
/* networkbyte ordered */
uint32_t sin6_flowinfo; /* flow information,undefined */
struct in6_addrsin6_addr; /* IPv6 address */
/* networkbyte ordered */
uint32_t sin6_scope_id; /* set of interfaces fora scope */
};
数组