Lwip的udp编程

Lwip的udp编程这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Ma…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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,&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();

  	//每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);//释放内存
}
}

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 看完让你彻底搞懂Websocket原理

    看完让你彻底搞懂Websocket原理

    2021年10月14日
    55
  • usb转rs485 linux驱动下载,USB转RS485串口驱动「建议收藏」

    usb转rs485 linux驱动下载,USB转RS485串口驱动「建议收藏」USB转RS485串口驱动是一款非常专业的USB转RS485驱动安装程序。这款软件适合WIN7/WINXP/LINUX等系统,能够帮助用户一键解决USB无法转换成RS485的问题,需要的小伙伴可下载体验。【安装方法】1、在安装前可以先看看使用说明再安装。将USB转换线插入电脑的USB接口中,系统会提示检测到新设备并出现新硬件添加向导,选择从列表或指定的位置安装,手动安装,找到刚刚驱动的解压目录,…

    2022年6月12日
    97
  • 电容分类_电解电容和薄膜电容的区别

    电容分类_电解电容和薄膜电容的区别一、按照功能  1.名称:聚酯(涤纶)电容   符号:(CL)  电容量:40p–4μ  额定电压:63–630V  主要特点:小体积,大容量,耐热耐湿,稳定性差  应用:对稳定性和损耗要求不高的低频电路  2.名称:聚苯乙烯电容  符号:(CB)  电容量:10p–1μ  额定电压:100V–30KV

    2022年8月22日
    6
  • eclipse安装gwt插件,浏览器安装gwt插件,eclipse启动gwt自带的工程,并在浏览器上访问,eclipse导入gwt工程「建议收藏」

    eclipse安装gwt插件,浏览器安装gwt插件,eclipse启动gwt自带的工程,并在浏览器上访问,eclipse导入gwt工程「建议收藏」eclipse安装gwt插件,浏览器安装gwt插件,eclipse启动gwt自带的工程,并在浏览器上访问,eclipse导入gwt工程

    2022年4月23日
    71
  • 什么是用户态和内核态的区别_内核态和用户态的概念

    什么是用户态和内核态的区别_内核态和用户态的概念什么是用户态和内核态从图上我们可以看出来通过系统调用将Linux整个体系分为用户态和内核态(或者说内核空间和用户空间)。那内核态到底是什么呢?其实从本质上说就是我们所说的内核,它是一种特殊的软件程序,特殊在哪儿呢?控制计算机的硬件资源,例如协调CPU资源,分配内存资源,并且提供稳定的环境供应用程序运行。用户态就是提供应用程序运行的空间,为了使应用程序访问到内核管理的资源例如CPU,内存,I/O。内核必须提供一组通用的访问接口,这些接口就叫系统调用。为什么要区分内核态和用户态往往我们的系统的资源是

    2025年12月5日
    4
  • Google EventBus 使用详解

    Google EventBus 使用详解EventBus是Google.Guava提供的消息发布-订阅类库,它实现了观察者设计模式,消息通知负责人通过EventBus去注册/注销观察者,最后由消息通知负责人给观察者发布消息。首先使用 maven 依赖:<!– https://mvnrepository.com/artifact/com.google.guava/guava –> <dependenc…

    2022年6月17日
    121

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号