我使用 LWIP 协议栈接收广播,
目前能接收到 PC 端发送的广播,但是接收到数据后再发送出去,PC端就没收到返回了。
struct udp_pcb *g_pcb;
void UDP_server_init(void)
{
g_pcb = udp_new(); //申请udp控制块
//udp_bind(pcb,IP_ADDR_ANY,UDP_LOCAL_PORT); /* 绑定本地IP地址和端口号(作为udp服务器) */
//g_pcb->so_options |= SOF_BROADCAST;
udp_bind(g_pcb,IP_ADDR_BROADCAST,UDP_LOCAL_PORT);
udp_recv(g_pcb,udp_server_recv,NULL); /* 设置UDP段到时的回调函数 */
}
udp_server_recv(void *arg, struct udp_pcb *pcb, struct pbuf *p,struct ip_addr *addr, u16_t port)
{
struct ip_addr destAddr = *addr; /* 获取远程主机 IP地址 */
u16_t nSendPort;
if(p != NULL)
{
/******将数据原样返回*******************/
udp_sendto(pcb,p,&destAddr,port); /* 将收到的数据再发送出去 */
pbuf_free(p); /* 释放该UDP段 */
}
}
接收到数据后再发送出去,PC端就没收到返回了:LZ 确认 PC 会回吗?LWIP 这个东东偶没有用过。
如果确认会回,可能是 PC 没有接收到设备发出的数据。设备发送数据是否成功?发送链路是否 OK 呢? PC端抓包看看,然后再分析。 pc收到你回的包了吗?如果收到没回,可能是数据不对。如果没有收到那么有可能是设备发送没有成功。
udp_bind(g_pcb,IP_ADDR_BROADCAST,UDP_LOCAL_PORT);
改为
udp_bind(pcb,IP_ADDR_ANY,UDP_LOCAL_PORT);
就可以了~!