大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
第一次写博客,主要是想记录自己过程过程中接触到的知识:
在嵌入式系统中需要用到网络的地方很多,下面是Lwip中实现udp的例子:
#define UDP_DEMO_PORT 8087
struct netif lwip_netif; //定义一个全局的网络接口
int main(void)
{
struct netif *Netif_Init_Flag;
struct ip_addr ipaddr; //ip地址
struct ip_addr netmask; //子网掩码
struct ip_addr gw; //默认网关
struct udp_pcb *udppcb; //定义一个TCP服务器控制块
struct ip_addr rmtipaddr; //远端ip地址
lwip_init();
IP4_ADDR(&ipaddr,192,168,1,xxx); //设置本机IP
IP4_ADDR(&netmask,255,255,255,0);
IP4_ADDR(&gw,192,168,1,1);
Netif_Init_Flag=netif_add(&lwip_netif,&ipaddr,&netmask,&gw,NULL,ðernetif_init,ðernet_input); //添加网口
#ifdef DHCP
dhcp_start(&lwip_netif);
#endif /*DHCP*/
netif_set_default(&lwip_netif); //设置netif为默认网口
netif_set_up(&lwip_netif); //打开netif网口
udppcb=udp_new();
IP4_ADDR(&rmtipaddr, xxx, xxx, xxx, xxx); //设置远端IP
udp_connect(udppcb,&rmtipaddr,UDP_DEMO_PORT); //UDP客户端连接到指定远端服务器
udp_bind(udppcb,IP_ADDR_ANY,UDP_DEMO_PORT); //绑定远端IP地址与端口号
udp_recv(udppcb,udp_demo_recv,NULL); //注册接收回调函数,udp_demo_recv用于处理接收到的数据,该函数在特定
//的时候会被Lwip内核调用
_Bool DisConnetFlag=0; //断开连接标志
while(1)
{
LwipPriodTask(); //Lwip周期处理任务
if(DisConnetFlag)
{//断开udp连接时,记得执行以下函数,释放upcb内存块
udp_disconnect(upcb);
udp_remove(upcb);
}
}
}
void LwipPriodTask(void)
{ Lwip周期处理任务
//如果使用tcp,每250ms调用一次tcp_tmr()函数
tcp_tmr();
//每5s周期性调用一次ARP
etharp_tmr();
//如果使用DHCP
dhcp_fine_tmr(); // 1)每500ms调用一次dhcp_fine_tmr()
dhcp_coarse_tmr(); // 2)每60s执行一次DHCP粗糙处理
}
//Lwip在收到数据后,为用户处提供理数据的接口
#define UDP_DEMO_RX_BUFSIZE 1024
#define udp_demo_recvbuf[UDP_DEMO_RX_BUFSIZE]
void udp_demo_recv(void *arg,struct udp_pcb *upcb,struct pbuf *p,struct ip_addr *addr,u16_t port)
{
u32 data_len = 0;
struct pbuf *q;
if(p!=NULL) //接收到不为空的数据时
{
memset(udp_demo_recvbuf,0,UDP_DEMO_RX_BUFSIZE); //数据接收缓冲区清零
for(q=p;q!=NULL;q=q->next) //遍历完整个pbuf链表
{
//判断要拷贝到udp_demo_recvbuf中的数据是否大于udp_demo_recvbuf的剩余空间,如果大于
//的话就只拷贝udp_demo_recvbuf中剩余长度的数据,否则的话就拷贝所有的数据
if(q->len > (UDP_DEMO_RX_BUFSIZE-data_len))
{
memcpy(udp_demo_recvbuf+data_len,q->payload,(UDP_DEMO_RX_BUFSIZE-data_len));//拷贝数据
}
else
{
memcpy(udp_demo_recvbuf+data_len,q->payload,q->len);
}
data_len += q->len;
if(data_len > UDP_DEMO_RX_BUFSIZE)
{
break; //超出TCP客户端接收数组,跳出
}
}
upcb->remote_ip=*addr; //记录远程主机的IP地址
upcb->remote_port=port; //记录远程主机的端口号
pbuf_free(p);//释放内存
}
else
{
uudp_disconnect(upcb);
udp_remove(upcb);
}
}
//UDP服务器发送数据
unsigend char tcp_demo_sendbuf = “this is udp send Test!”
void udp_demo_senddata(struct udp_pcb upcb)
{
struct pbuf ptr;
ptr=pbuf_alloc(PBUF_TRANSPORT,strlen((char)tcp_demo_sendbuf),PBUF_POOL); //申请内存
if(ptr)
{
pbuf_take(ptr,(char)tcp_demo_sendbuf,strlen((char)tcp_demo_sendbuf)); //将tcp_demo_sendbuf中的数据打包进pbuf结构中
udp_send(upcb,ptr); //udp发送数据
pbuf_free(ptr);//释放内存
}
}
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197837.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...