标签归档:UDP

UDP绑定IP_ADDR_ANY和固定IP的区别

在LWIP中,初始化一个UDP端口

struct udp_pcb *FirstUpcb;

如果绑定控制器的IP,要如下定义:

void First_UdpInit(void)

{

ip_addr_t local_ipaddr;

IP4_ADDR(&local_ipaddr,MyIP[0],MyIP[1],MyIP[2],MyIP[3]);

FirstUpcb = udp_new();

udp_bind(FirstUpcb,&local_ipaddr,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

MyIP[0],MyIP[1],MyIP[2],MyIP[3]为控制器的IP。

如果绑定IP_ADDR_ANY,如下定义:

void First_UdpInit(void)

{

FirstUpcb = udp_new();

udp_bind(FirstUpcb,IP_ADDR_ANY,FirstUdpport);

udp_recv(FirstUpcb,udp_callback,NULL);

}

当上位机发送一个UDP广播数据:

FF FF FF FF FF FF 00 E0 66 78 3A 84 08 00 45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF 27 0E 27 0E 00 17 C5 EA 02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

FF FF FF FF FF FF:目的MAC地址,表示是广播

00 E0 66 78 3A 84 :源MAC地址

08 00:帧类型,表示是IP包

以上是14字节以太网首部数据。

45 00 00 2B 2F 01 00 00 40 11 85 FF C0 A8 05 1A FF FF FF FF

是20字节IP首部,其中C0 A8 05 1A是源IP地址,FF FF FF FF是目的IP地址,这里表示是广播地址。

27 0E 27 0E 00 17 C5 EA

是UDP首部

02 00 0B FF FF FF FF FF FF 31 55 00 FF 90 03

是UDP数据。

如果控制器采用第一种方式初始化UDP端口,绑定自己的IP地址,那么不会接收这条UDP命令,因为这条命令的目的IP地址不等于本地IP地址。

如果控制器采用第二种方式初始化UDP端口,绑定IP_ADDR_ANY,控制器会接收到这条命令,UDP的回调函数会处理这条命令。

IP_ADDR_ANY的意思是,只要UDP数据的目的端口和UDP绑定的端口一样,UDP控制块就会处理这条数据,不管这条数据的目的IP是不是发送给本地IP。