前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Lwip的udp编程

Lwip的udp编程

作者头像
全栈程序员站长
发布2022-10-02 17:20:30
7600
发布2022-10-02 17:20:30
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

第一次写博客,主要是想记录自己过程过程中接触到的知识:

在嵌入式系统中需要用到网络的地方很多,下面是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地址

代码语言:javascript
复制
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,&ethernetif_init,&ethernet_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();

代码语言:javascript
复制
  	//每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;

代码语言:javascript
复制
		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);//释放内存 } }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/197837.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年9月3日 上,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云服务器
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档