最近在使用LM3S6911这款芯片利用LWIP1.3.2一个UDP客户端。主要是参考ek-lm3s6965中enet_lwip例程进行修改。
const unsigned char UDPData[] = "UDP 测试程序";
struct ip_addr local_addr,dest_addr;
struct udp_pcb *UdpPcb;
struct pbuf *p_tx;
void UDP_Send(void)
{
p_tx = pbuf_alloc(PBUF_RAW, sizeof(UDPData), PBUF_RAM); // 按照指定类型分配一个pbuf结构体 // struct pbuf *p_tx;
p_tx->payload = (void *)UDPData; // 实际发送数据内存区
IP4_ADDR(&local_addr,192,168,1,10); // 本地IP地址:192.168.1.10
IP4_ADDR(&dest_addr,192,168,1,11); // 电脑IP地址:192.168.1.11
UdpPcb = udp_new(); // 创建udp协议控制块
udp_bind(UdpPcb,&local_addr, 1025); // 在协议控制块中绑定本地ip地址和本地端口号,本地:开发板(程序下到开发板中)
udp_connect(UdpPcb, IP_ADDR_ANY,2000); // IP_ADDR_ANY与远端udp主机建立连接,远端:笔记本
while(1)
{
udp_send(UdpPcb,p_tx);
delay(5000);
}
}
然后我用抓包软件能抓到网络数据且正确,显示的是以广播的形式发送。参数IP_ADDR_ANY我跟踪了一下,定义如下;
#define IP_ADDR_ANY ((struct ip_addr *)&ip_addr_any)
#define IP_ADDR_BROADCAST ((struct ip_addr *)&ip_addr_broadcast)
const struct ip_addr ip_addr_any = { IP_ADDR_ANY_VALUE };
const struct ip_addr ip_addr_broadcast = { IP_ADDR_BROADCAST_VALUE };
#define IP_ADDR_ANY_VALUE 0x00000000UL
#define IP_ADDR_BROADCAST_VALUE 0xffffffffUL
疑问:
1.广播地址按定义应该是255.255.255.255。但抓包发现参数为IP_ADDR_ANY(0x00000000UL) 时,为什么也是以广播的形式发送。
2.如果更改参数IP_ADDR_ANY为&dest_addr时,就是让与一个具体的ip连接,数据不能发送,一直处于ARP请求与应答。