在lwip中无论使用socket还是netconn接口,都需要调用bind与本地的IP与端口进行绑定。在一些网络编程入门教程中,选择INADDR_ANY作为本地绑定的IP,而端口号则固定。
/*绑定本地IP与PORT*/
netconn_bind(conn, IP_ADDR_ANY, UDP_SEVER_PORT);
在lwip中,可以看到INADDR_ANY即为0.0.0.0这个IP。
/** 0.0.0.0 */
#define IPADDR_ANY ((u32_t)0x00000000UL)
这么做的目的是,即表示所有发送到服务器的这个端口,不管是哪个网卡/哪个IP地址接收到的 数据,都由这个服务端进程进行处理。
那么,这个宏定义到底是什么含义呢? 这个宏能够让程序员在不知道本机IP地址的情况下,使用它来代表本机所有接口的IP地址。也就是说,使用这个宏作为监听地址的话,不管本机有多少个接口,socket都会监听。
举个例子,假设一个主机有inter1,inter2,inter3三个接口,如果一个socket绑定了INADDR_ANY的地址和8000 的端口,那么,从客户端过来的一个UDP包到达该主机,不管客户端connect的是inter1,inter2,inter3中的哪个地址,都会被该socket接收到。如果此时主机还要再建立一个新的socket,使用inter1接口和端口8000,将会失败, 因为这个端口和地址已经被第一个socket监听了。 上面是接收的情况,那么,发送数据报给客户端的时候,到底是用哪个接口发送呢? 这个就是根据本机路由表的配置情况,选择最合适的路径对应的接口来发送。