我们知道一个 TCP 连接由 C/S 两端的 (IP_Addr, Port_num) 唯一标识。
lwip_bind(a,b,c) 用来将之前创建的 socket 和本地的 IP_Addr / Port_num 绑定在一起。
在 [TCP][一] API 一节中,我们列出 C/S 两端常用的接口,其中 Client 并没有 lwip_bind(),而 server 却有。是不是说 Client 不需要绑定 而 Server 必须先绑定呢?答案是Yes。先看函数解析,再来谈为啥么。
目录
函数原型
int lwip_bind(int s, const struct sockaddr *name, socklen_t namelen)
参数:
s,即 [TCP][二] 所讲 socket fd (>= 0)
name,即 struct sockaddr_in 的指针,用于指定要绑定的 local ip address 和 port num
namelen,即 sizeof(struct sockaddr_in)
返回:
0,绑定成功
-1,绑定失败
local_ip / local_port
还记得 [TCP][二] 中提到的 tcp_pcb 吗?该函数的作用就是设置 tcp_pcb 中的两个参数:local_ip 和 local_port。
当入参中的 ip address 和 port num 不为 0 时,这两个参数就设置为入参的值。
注意:如果入参的 ip 为 INADDR_ANY(即 0),则会默认使用当前网络接口的 ip address;如果入参的 port 为 0,则会随机分配一个还未使用的 port num;
即,local_ip 和 local_port 若外部指定了,就用外部指定的值;若外部没有指定,就用内部指定的值。
Client 怎么没有 bind?
一般 Server 端都会有 bind 这一步,为甚么 Client 端却很少见?
由前一小节我们知道,bind 动作用于指定 local_ip 和 local_port。server 端的身份(IP_Addr, Port_num)一般都是固定的,这样 Client 连接时才知道要跟哪个 ip 的哪个 port 建立连接,如果 server 端的 Port_num 随机变动,你让 Client 情何以堪。而 Client 端的 Port_num 固不固定无所谓,有个可用的 port 就行(别人又不会主动向你发起连接!),而为了避免和本地已用的 port 产生冲突,通常就不会指定必须要用某个 port,由内部自由分配还不会产生冲突,多好。
所以,一般 Server 都会用 bind 来指定使用某个固定 local_port;而 Client 一般都不指定 port,也就没有 bind 这一步。
嘿嘿,写完下班~