LWIP
目录
LWIP移植:
手动移植LWIP(裸机):
基于CubeMX移植LWIP(裸机):
参考(官网API讲解链接):
https://www.nongnu.org/lwip/2_1_x/group__udp__raw.html
RAW UDP接口:
udp_new(创建UDP控制块)
API: | struct udp_pcb * udp_new(void) |
作 用: | 创建一个UDP控制快 |
参 数: | 无 |
返回值: | udp_pcb :返回成功创建的UDP控制块 NULL:创建控制块失败 |
udp_remove(移除UDP控制块)
API: | void udp_remove(struct udp_pcb *pcb) |
作 用: | 移除一个UDP控制块,释放该控制块内存 |
参 数: | pcb: 指定一个UDP控制块移除 |
返回值: | 无 |
udp_bind(UDP绑定IP及端口)
API: | err_t udp_bind(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) |
作 用: | 使UDP控制块绑定一个IP和端口 |
参 数: | pcb: 指定一个需要绑定的UDP控制块 port:要绑定的本地 UDP 端口。使用 0 可自动绑定到 UDP_LOCAL_PORT_RANGE_START 和 UDP_LOCAL_PORT_RANGE_END 之间的随机端口 注意:iPaddr和端口应按照PCB中的字节顺序排列 |
返回值: | lwIP 错误代码 ERR_OK:成功 ERR_USE:指定的 ipaddr 和端口已经被另一个 UDP PCB 绑定到。 |
udp_connect(设置 PCB 的远程端)
API: | err_t udp_connect(struct udp_pcb *pcb, const ip_addr_t *ipaddr, u16_t port) |
作 用: | 使UDP控制块连接一个为指定IP和端口的主机 |
参 数: | pcb: 指定一个需要连接的UDP控制块 port:要连接的远程 UDP 端口 注意:iPaddr和端口应按照PCB中的字节顺序排列 如果尚未绑定,则 udp pcb 将绑定到随机本地端口 |
返回值: | lwIP 错误代码 |
udp_disconnect(移除 PCB 的远程端)
API: | void udp_disconnect(struct udp_pcb *pcb) |
作 用: | 使UDP控制块断开连接 |
参 数: | pcb: 要断开连接的UDP PCB |
返回值: | lwIP 错误代码 |
udp_recv(设置 UDP PCB 的接收回调)
API: | void udp_recv(struct udp_pcb *pcb, udp_recv_fn recv, void *recv_arg) |
作 用: | 创建一个UDP接受回调函数 |
参 数: | pcb: 要为其设置 RECV 回调的 PCB recv:回调函数的函数指针 recv_arg:传递给回调函数的附加参数 |
返回值: | 无 |
udp_send(UDP发送函数)
API: | err_t udp_send(struct udp_pcb *pcb, struct pbuf *p) |
作 用: | 使用UDP发送pbuf |
参 数: | pcb: 用于发送数据的 UDP PCB。 p:要发送的PBUF链 注意:数据报将被发送到当前remote_ip并remote_port存储在pcb中。如果 pcb 没有绑定到某个端口,它会自动绑定到一个随机端口。 |
返回值: | lwIP 错误代码 ERR_OK:成功。未发生错误 ERR_MEM:内存不足 ERR_RTE:找不到到目标地址的路由 ERR_VAL:无 PCB 或 PCB 为双堆栈 注意:较低的协议层可能会返回更多错误 |
UDP初始化源码(含:绑定IP、远程主机连接、回调函数)
#define U_DEST_IP_ADDR0 xxx //对方IP
#define U_DEST_IP_ADDR1 xxx
#define U_DEST_IP_ADDR2 xxx
#define U_DEST_IP_ADDR3 xxx
#define UDP_BIND_PORT xxx //监听端口
#define UDP_REMOTE_PORT xxx //发送端口
struct udp_pcb *upcb; //UDP控制块
void UDP_Init()
{
ip_addr_t remote_ip; //对方IP
upcb = udp_new(); //创建UDP控制块
/* IP_ADDR_ANY:该参数为 lwip移植时分配的IP */
udp_bind(upcb,IP_ADDR_ANY,UDP_BIND_PORT); //绑定IP、端口
IP4_ADDR(&remote_ip,U_DEST_IP_ADDR0,U_DEST_IP_ADDR1,U_DEST_IP_ADDR2,U_DEST_IP_ADDR3); //设置由四个字节部分给出的IP地址
udp_connect(upcb,&remote_ip,UDP_REMOTE_PORT); //设置固定远端地址及端口
udp_recv(upcb, udp_demo_recv, NULL); // 注册报文处理回调
}
/**
* @brief UDP服务器回调函数
* @param arg :传入的参数
* @param upcb:UDP控制块
* @param p : 网络数据包
* @param addr:远程主机IP地址
* @param port:远程主机端口号
* @retval 无
*/
void udp_demo_recv(void *arg, struct udp_pcb *upcb, struct pbuf *p, const ip_addr_t *addr, u16_t port)
{
uint32_t order; //存放接收数据
//将UDP接收到的消息保存 并释放内存
order = ntohs(*(u16_t *)p->payload);
memset(p->payload, 0 , p->tot_len);
pbuf_free(p);
}
UDP发送(源码)
err_t UDP_Send_Data(struct udp_pcb *upcb,uint8_t *ad,uint32_t len)
{
struct pbuf *ptr; //创建pbuf
err_t err;
ptr = pbuf_alloc(PBUF_TRANSPORT,len,PBUF_POOL); //申请内存
if(ptr == NULL)
{
return ERR_MEM;
}
memset(ptr->payload, 0 , ptr->len); //清零
memcpy((char*)ptr->payload, ad, len); //数据
err = udp_send(upcb,ptr); //发送数据
if(err != ERR_OK)
{
return ERR_ABRT;
}
memset(ptr->payload, 0 , ptr->len);
pbuf_free(ptr);//释放内存
return ERR_OK;
}
本文只介绍了部分常用UDP API 如果想了解更多API使用可去LWIP官网
有问题欢迎大家指正讨论