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

在嵌入式系统中需要用到网络的地方很多,下面是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);   //设置远端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编程相关推荐

  1. [C# 网络编程系列]专题七:UDP编程补充——UDP广播程序的实现

    上次因为时间的关系,所以把上一个专题遗留下的一个问题在本专题中和大家分享下,本专题主要介绍下如何实现UDP广播的程序,下面就直接介绍实现过程和代码以及运行的结果. 一.程序实现 UDP广播程序的实现代 ...

  2. [C# 网络编程系列]专题六:UDP编程

    引言: 前一个专题简单介绍了TCP编程的一些知识,UDP与TCP地位相当的另一个传输层协议,它也是当下流行的很多主流网络应用(例如QQ.MSN和Skype等一些即时通信软件传输层都是应用UDP协议的) ...

  3. Java刷题知识点之TCP、UDP、TCP和UDP的区别、socket、TCP编程的客户端一般步骤、TCP编程的服务器端一般步骤、UDP编程的客户端一般步骤、UDP编程的服务器端一般步骤...

    TCP和UDP是两个传输层协议,广泛应用于网络中不同主机之间传输数据.对任何程序员来说,熟悉TCP和UDP的工作方式都是至关重要的.这就是为什么TCP和UDP是一个流行的Java编程面试问题. Jav ...

  4. 穿透Socks5 代理的UDP编程

    网络编程中,对于数据传输实时性要求较高的场合,大家都会选择UDP来作为数据传输协议,在TCP/IP协议族中UDP协议较TCP协议需要的网络系统资源更少.然而在企业应用中,由于网络安全原因等会导致除了特 ...

  5. TCP/UDP编程中的问题汇总

    TCP/UDP编程中的问题汇总 TCP和UDP发送大文件的问题. 答: 发送端: 发送时,先发送文件的名称及大小等信息. 然后,设置一个缓冲区的大小,假设为4K. 再循环读4K的文件内容,并发送,直到 ...

  6. Java UDP 编程简介.

    一.UDP 协议简介 UPD协议 是常见的 网络传输协议之一, 当然另1个是TCP协议. UPD协议 是一种不靠的协议. 是因为发送方不会关心接受方的状态, 直接向接收方发送数据包, 也就是说这个数据 ...

  7. Qt学习笔记之UDP编程

    1. UDP概述 UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中 ...

  8. 【Linux网络编程】UDP编程

    00. 目录 文章目录 00. 目录 01. 概述 02. UDP编程C/S结构 03. UDP常用函数 3.1 sendto函数 3.2 recvfrom函数 3.3 bind函数 04. 程序示例 ...

  9. python的基础网络编程是下列_Python入门基础之网络编程、socket编程、TCP、UDP编程...

    忙了两天,继续更文!希望多多支持. 套接字 套接字是一种具有之前所说的"通讯端点"概念的计算机网络数据结构.网络化的应用程序在开始任何通讯之前都必需要创建套接字. 套接字有三种: ...

  10. .Net TCP/UDP 编程 【一】【原创】

    命名空间: using System.Net; using System.Net.Sockets; 关键 : TCP /UDP连接 UDP UDP 与 tCP的主要区别在于 UDP 不一定提供可靠的数 ...

最新文章

  1. dojo发布者订阅者模式(topic.publish/topic.subscribe)
  2. 客户合作伙伴关系问题
  3. el-table中设置fixed固定列之后错位的奇葩原因
  4. docker ip地址_理解 Docker 网络(番外) -- 《Docker 源码分析》勘误
  5. 前端学习(3214):state的一个简洁方式
  6. Web黑客工具箱之LiveHttpHeaders
  7. 板式橡胶支座弹性模量怎样计算_Midas Civil支座模拟的详细解决方法
  8. android程序表白,几条曲线构建Android表白程序
  9. What?一周内咸鱼疯转2.4W次,最终被所有大厂封杀!
  10. ubuntu 搭建 php 环境
  11. javaScript数据类型转换—显式转换(二)
  12. 软件测试人员必备工具介绍--如何滚屏抓取图片-SnagIt篇(图)
  13. DWM1000模块简介
  14. 布谷鸟算法的一些个人整理
  15. Nginx+Tomcat负载均衡--win7配置详解
  16. 双硬盘双系统(windows10+deepin)
  17. 微信支付——后台对接
  18. python计算三角形的周长和面积
  19. mysqli mysql assoc,mysqli中的mysql_fetch_assoc?
  20. oracle异地接管,群集的接管和故障恢复 - Oracle® ZFS Storage Appliance 管理指南,发行版 OS8.6.0...

热门文章

  1. win10怎么进入修复计算机,Win10怎么进入安全模式以及Win10:使用Windows恢复环境轻松修复...
  2. EXCEL 导入MSSqlserver数据库报错
  3. 常用javascript编码规范
  4. windows环境下curl 安装和使用
  5. 阿里云CentOS服务器搭建静态网站(零基础)
  6. uni-app详情页开发
  7. 关于一些初级ACM竞赛题目的分析和题解(七)。
  8. 戴尔服务器显示器接口类型,拒绝凌乱桌面 Type-C接口显示器的魅力
  9. VirtualBox下安装Windows Server 2008
  10. 利用matlab聚类分析,利用Matlab软件实现聚类分析