9.2. bind()
将一个 socket 关联到一个 IP address 及 port number 函数原型
说明
当远程机器想要连接到你的服务器程序时,他需要两项信息:IP address 及 port number。
而 bind() call 可以让你做这件事。
首先你要先调用 getaddrinfo() 载入 struct sockaddr,以取得 destination address(目地地址)与 port 的信息。然后你调用 socket() 以取得一个 socket descriptor,接着将这个 socket 与 address 传递给 bind(),然后 IP address 跟 port 就会很神奇的跟 socket 绑在一起了(使用真的法术)!
如果你不知道你计算机的 IP address、或你知道你的计算机只有一个 IP address、或你不在意要用计算机上的哪个 IP address 时,你可以单纯地将 getaddrinfo() 的 hints.ai_flags 参数设置为 AI_PASSIVE,这里所做的事情就是将特别的值填入 struct sockaddr 的 IP address 字段,以告诉 bind() 说它应该要自动填入这个主机的 IP address。
什么?将什么特别的值填入 struct sockaddr 的 IP address 字段就可以让它自动填上目前主机的 address 呢?
我会告诉你的,但是请记住这只适用于你手动填入 struct sockaddr 时,如果不是,请依据上述方式,使用 getaddrinfo() 返回的结果。在 IPv4 中, struct sockaddr_in 结构的 sin_addr.s_addr 会设置为 INADDR_ANY;而在 IPv6 中, struct sockaddr_in6 结构的 sin6_addr 字段会从全局变量 in6addr_any 载入。或者,若你正宣告一个新的 struct in6_addr,你可以将它初始为 IN6ADDR_ANY_INIT。
最后,addrlen 参数应该设置为 my_addr 的大小。
返回值
成功时返回零,或者错误时返回 -1(并依据错误设置 errno) 范例
参照 getaddrinfo(), socket(), struct sockaddr_in, struct in_addr
Last updated