Lwip的udp编程
第一次写博客,主要是想记录自己过程过程中接触到的知识:
在嵌入式系统中需要用到网络的地方很多,下面是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); //设置远端IPudp_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周期性调用一次ARPetharp_tmr();//如果使用DHCPdhcp_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);//释放内存
}
}
Lwip的udp编程相关推荐
- [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现
上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...
- [C# 网络编程系列]专题六:UDP编程
引言: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...
- Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...
TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...
- 穿透Socks5 代理的UDP编程
网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少.然而在企业应用中,由于网络安全原因等会导致除了特 ...
- TCP/UDP编程中的问题汇总
TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...
- Java UDP 编程简介.
一.UDP 协议简介 UPD协议 是常见的 网络传输协议之一, 当然另1个是TCP协议. UPD协议 是一种不靠的协议. 是因为发送方不会关心接受方的状态, 直接向接收方发送数据包, 也就是说这个数据 ...
- Qt学习笔记之UDP编程
1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中 ...
- 【Linux网络编程】UDP编程
00. 目录 文章目录 00. 目录 01. 概述 02. UDP编程C/S结构 03. UDP常用函数 3.1 sendto函数 3.2 recvfrom函数 3.3 bind函数 04. 程序示例 ...
- python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...
忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...
- .Net TCP/UDP 编程 【一】【原创】
命名空间: using System.Net; using System.Net.Sockets; 关键 : TCP /UDP连接 UDP UDP 与 tCP的主要区别在于 UDP 不一定提供可靠的数 ...
最新文章
- dojo发布者订阅者模式(topic.publish/topic.subscribe)
- 客户合作伙伴关系问题
- el-table中设置fixed固定列之后错位的奇葩原因
- docker ip地址_理解 Docker 网络(番外) -- 《Docker 源码分析》勘误
- 前端学习(3214):state的一个简洁方式
- Web黑客工具箱之LiveHttpHeaders
- 板式橡胶支座弹性模量怎样计算_Midas Civil支座模拟的详细解决方法
- android程序表白,几条曲线构建Android表白程序
- What?一周内咸鱼疯转2.4W次,最终被所有大厂封杀!
- ubuntu 搭建 php 环境
- javaScript数据类型转换—显式转换(二)
- 软件测试人员必备工具介绍--如何滚屏抓取图片-SnagIt篇(图)
- DWM1000模块简介
- 布谷鸟算法的一些个人整理
- Nginx+Tomcat负载均衡--win7配置详解
- 双硬盘双系统(windows10+deepin)
- 微信支付——后台对接
- python计算三角形的周长和面积
- mysqli mysql assoc,mysqli中的mysql_fetch_assoc?
- oracle异地接管,群集的接管和故障恢复 - 
Oracle® ZFS Storage Appliance 管理指南,发行版 OS8.6.0...
热门文章
- win10怎么进入修复计算机,Win10怎么进入安全模式以及Win10:使用Windows恢复环境轻松修复...
- EXCEL 导入MSSqlserver数据库报错
- 常用javascript编码规范
- windows环境下curl 安装和使用
- 阿里云CentOS服务器搭建静态网站(零基础)
- uni-app详情页开发
- 关于一些初级ACM竞赛题目的分析和题解(七)。
- 戴尔服务器显示器接口类型,拒绝凌乱桌面 Type-C接口显示器的魅力
- VirtualBox下安装Windows Server 2008
- 利用matlab聚类分析,利用Matlab软件实现聚类分析